Fix a bug with max height

New icon for app
Working on creator activity
This commit is contained in:
oupson 2020-01-26 12:37:06 +01:00
parent 72168deb03
commit 9197f871fd
30 changed files with 354 additions and 293 deletions

View File

@ -3,6 +3,161 @@
<component name="WizardSettings">
<option name="children">
<map>
<entry key="imageWizard">
<value>
<PersistentState>
<option name="children">
<map>
<entry key="imageAssetPanel">
<value>
<PersistentState>
<option name="children">
<map>
<entry key="actionbar">
<value>
<PersistentState>
<option name="children">
<map>
<entry key="clipArt">
<value>
<PersistentState>
<option name="values">
<map>
<entry key="color" value="000000" />
</map>
</option>
</PersistentState>
</value>
</entry>
</map>
</option>
<option name="values">
<map>
<entry key="theme" value="HOLO_DARK" />
<entry key="themeColor" value="ffffff" />
</map>
</option>
</PersistentState>
</value>
</entry>
<entry key="launcher">
<value>
<PersistentState>
<option name="children">
<map>
<entry key="foregroundClipArt">
<value>
<PersistentState>
<option name="values">
<map>
<entry key="color" value="ffffff" />
</map>
</option>
</PersistentState>
</value>
</entry>
<entry key="foregroundImage">
<value>
<PersistentState>
<option name="values">
<map>
<entry key="color" value="000000" />
</map>
</option>
</PersistentState>
</value>
</entry>
<entry key="foregroundText">
<value>
<PersistentState>
<option name="values">
<map>
<entry key="color" value="ffffff" />
<entry key="scalingPercent" value="82" />
</map>
</option>
</PersistentState>
</value>
</entry>
<entry key="foregroundTextAsset">
<value>
<PersistentState>
<option name="values">
<map>
<entry key="fontFamily" value="Ubuntu" />
<entry key="text" value="K" />
</map>
</option>
</PersistentState>
</value>
</entry>
</map>
</option>
<option name="values">
<map>
<entry key="backgroundAssetType" value="COLOR" />
<entry key="foregroundAssetType" value="TEXT" />
<entry key="generateWebIcon" value="false" />
<entry key="legacyIconShape" value="CIRCLE" />
<entry key="showGrid" value="true" />
<entry key="webIconShape" value="CIRCLE" />
</map>
</option>
</PersistentState>
</value>
</entry>
<entry key="launcherLegacy">
<value>
<PersistentState>
<option name="children">
<map>
<entry key="clipArt">
<value>
<PersistentState>
<option name="values">
<map>
<entry key="color" value="000000" />
</map>
</option>
</PersistentState>
</value>
</entry>
</map>
</option>
</PersistentState>
</value>
</entry>
<entry key="notification">
<value>
<PersistentState>
<option name="children">
<map>
<entry key="clipArt">
<value>
<PersistentState>
<option name="values">
<map>
<entry key="color" value="000000" />
</map>
</option>
</PersistentState>
</value>
</entry>
</map>
</option>
</PersistentState>
</value>
</entry>
</map>
</option>
</PersistentState>
</value>
</entry>
</map>
</option>
</PersistentState>
</value>
</entry>
<entry key="vectorWizard">
<value>
<PersistentState>
@ -18,7 +173,7 @@
<PersistentState>
<option name="values">
<map>
<entry key="url" value="jar:file:/C:/Program%20Files/Android/Android%20Studio/plugins/android/lib/android.jar!/images/material_design_icons/social/ic_share_black_24dp.xml" />
<entry key="url" value="jar:file:/C:/Program%20Files/Android/Android%20Studio/plugins/android/lib/android.jar!/images/material_design_icons/content/ic_save_black_24dp.xml" />
</map>
</option>
</PersistentState>
@ -29,7 +184,7 @@
<option name="values">
<map>
<entry key="color" value="ffffff" />
<entry key="outputName" value="ic_share_share_24dp" />
<entry key="outputName" value="ic_save_white_24dp" />
<entry key="sourceFile" value="C:\Users\oupso\Downloads\java-seeklogo.com.svg" />
</map>
</option>

View File

@ -126,7 +126,7 @@ class ApngDecoder {
val height = fcTL.pngHeight
if (xOffset + width > maxWidth) {
throw BadApng("`yOffset` + `height` must be <= `IHDR` height")
throw BadApng("`xOffset` + `width` must be <= `IHDR` width")
} else if (yOffset + height > maxHeight) {
throw BadApng("`yOffset` + `height` must be <= `IHDR` height")
}

View File

@ -27,6 +27,9 @@ class ApngEncoder(
outputStream.write(generateACTL(numberOfFrames))
}
// TODO ADD SUPPORT FOR FIRST FRAME NOT IN ANIM
// TODO OPTIMISE APNG
fun writeFrame(
inputStream: InputStream,
delay: Float = 1000f,
@ -38,6 +41,13 @@ class ApngEncoder(
val btm = BitmapFactory.decodeStream(inputStream)
inputStream.close()
if (frameIndex == 0) {
if (btm.width != width)
throw Exception("Width of first frame must be equal to width of APNG. (${btm.width} != $width)")
if (btm.height != height)
throw Exception("Height of first frame must be equal to height of APNG. (${btm.height} != $height)")
}
generateFCTL(btm, delay, disposeOp, blendOp, xOffsets, yOffsets)
val idat = IDAT().apply {
@ -186,8 +196,8 @@ class ApngEncoder(
fcTL.addAll(Utils.to4Bytes(btm.height).asList())
// Add offsets
fcTL.addAll(Utils.to4Bytes(xOffsets ).asList())
fcTL.addAll(Utils.to4Bytes(yOffsets ).asList())
fcTL.addAll(Utils.to4Bytes(xOffsets).asList())
fcTL.addAll(Utils.to4Bytes(yOffsets).asList())
// Set frame delay
fcTL.addAll(Utils.to2Bytes(delay.toInt()).asList())

View File

@ -46,8 +46,5 @@ dependencies {
// implementation fileTree(include: ['*.aar'], dir: 'libs')
//implementation 'com.github.oupson:Kapng-Android:1.0.0'
implementation 'com.google.android.material:material:1.2.0-alpha04'
implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
implementation "org.jetbrains.anko:anko-design:$anko_version"
implementation "org.jetbrains.anko:anko-constraint-layout:$anko_version"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2'
}

View File

@ -5,6 +5,7 @@ import android.content.Intent
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
@ -12,7 +13,12 @@ import androidx.core.content.FileProvider
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.activity_creator.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import oupson.apng.encoder.ApngEncoder
import oupson.apngcreator.BuildConfig
import oupson.apngcreator.R
@ -22,7 +28,9 @@ import java.io.FileOutputStream
class CreatorActivity : AppCompatActivity() {
companion object {
private const val PICK_IMAGE = 999
private const val PICK_IMAGE = 1
private const val WRITE_REQUEST_CODE = 2
private const val TAG = "CreatorActivity"
}
private var items : ArrayList<Uri> = ArrayList()
private var adapter : ImageAdapter? = null
@ -41,7 +49,6 @@ class CreatorActivity : AppCompatActivity() {
)
}
/* frameListViewAdapter(this, items) */
adapter = ImageAdapter(this, items)
imageRecyclerView.layoutManager = LinearLayoutManager(this)
@ -64,92 +71,126 @@ class CreatorActivity : AppCompatActivity() {
return when (item?.itemId) {
R.id.menu_create_apng -> {
if (items.size > 0) {
val f = File(filesDir, "images/apng.png").apply {
if (!exists()) {
parentFile.mkdirs()
println(createNewFile())
GlobalScope.launch(Dispatchers.IO) {
val f = File(filesDir, "images/apng.png").apply {
if (!exists()) {
parentFile.mkdirs()
println(createNewFile())
}
}
val out = FileOutputStream(f)
var maxWidth = 0
var maxHeight = 0
items.forEach {
val str = contentResolver.openInputStream(it)
val btm = BitmapFactory.decodeStream(str)
if (btm.width > maxWidth)
maxWidth = btm.width
if (btm.height > maxHeight)
maxHeight = btm.height
str?.close()
}
if (BuildConfig.DEBUG)
Log.i(TAG, "MaxWidth : $maxWidth; MaxHeight : $maxHeight")
val encoder = ApngEncoder(out, maxWidth, maxHeight, items.size)
items.forEachIndexed { i, uri ->
// println("delay : ${adapter?.delay?.get(i)?.toFloat() ?: 1000f}ms")
val str = contentResolver.openInputStream(uri) ?: return@forEachIndexed
encoder.writeFrame(
str,
delay = adapter?.delay?.get(i)?.toFloat() ?: 1000f
)
}
encoder.writeEnd()
out.close()
withContext(Dispatchers.Main) {
val intent = Intent(Intent.ACTION_VIEW)
intent.data = FileProvider.getUriForFile(
this@CreatorActivity,
"${BuildConfig.APPLICATION_ID}.provider",
f
)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
startActivity(intent)
}
}
val out = FileOutputStream(f)
var maxWidth = 0
var maxHeight = 0
items.forEach {
val str = contentResolver.openInputStream(it)
val btm = BitmapFactory.decodeStream(str)
if (btm.width > maxWidth)
maxWidth = btm.width
else if(btm.height > maxHeight)
maxHeight = btm.height
str?.close()
}
val encoder = ApngEncoder(out, maxWidth, maxHeight, items.size)
items.forEachIndexed { i, uri ->
println("delay : ${adapter?.delay?.get(i)?.toFloat() ?: 1000f}ms")
val str = contentResolver.openInputStream(uri) ?: return@forEachIndexed
encoder.writeFrame(
str,
delay = adapter?.delay?.get(i)?.toFloat() ?: 1000f
)
}
encoder.writeEnd()
out.close()
val intent = Intent(Intent.ACTION_VIEW)
intent.data = FileProvider.getUriForFile(
this,
"${BuildConfig.APPLICATION_ID}.provider",
f
)
startActivity(intent)
}
true
}
R.id.menu_share_apng -> {
if (items.size > 0) {
val f = File(filesDir, "images/apng.png").apply {
if (!exists()) {
parentFile.mkdirs()
println(createNewFile())
GlobalScope.launch(Dispatchers.IO) {
val f = File(filesDir, "images/apng.png").apply {
if (!exists()) {
parentFile.mkdirs()
println(createNewFile())
}
}
val out = FileOutputStream(f)
var maxWidth = 0
var maxHeight = 0
items.forEach {
val str = contentResolver.openInputStream(it)
val btm = BitmapFactory.decodeStream(str)
if (btm.width > maxWidth)
maxWidth = btm.width
if (btm.height > maxHeight)
maxHeight = btm.height
str?.close()
}
val encoder = ApngEncoder(out, maxWidth, maxHeight, items.size)
items.forEachIndexed { i, uri ->
println("delay : ${adapter?.delay?.get(i)?.toFloat() ?: 1000f}ms")
val str = contentResolver.openInputStream(uri) ?: return@forEachIndexed
encoder.writeFrame(
str,
delay = adapter?.delay?.get(i)?.toFloat() ?: 1000f
)
}
encoder.writeEnd()
out.close()
withContext(Dispatchers.Main) {
val intent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(
Intent.EXTRA_STREAM, FileProvider.getUriForFile(
this@CreatorActivity,
"${BuildConfig.APPLICATION_ID}.provider",
f
)
)
type = "image/png"
}
startActivity(
Intent.createChooser(
intent,
resources.getText(R.string.share)
)
)
}
}
val out = FileOutputStream(f)
var maxWidth = 0
var maxHeight = 0
items.forEach {
val str = contentResolver.openInputStream(it)
val btm = BitmapFactory.decodeStream(str)
if (btm.width > maxWidth)
maxWidth = btm.width
else if(btm.height > maxHeight)
maxHeight = btm.height
str?.close()
}
}
true
}
R.id.menu_save_apng -> {
if (items.size > 0) {
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
// Filter to only show results that can be "opened", such as
// a file (as opposed to a list of contacts or timezones).
addCategory(Intent.CATEGORY_OPENABLE)
val encoder = ApngEncoder(out, maxWidth, maxHeight, items.size)
items.forEachIndexed { i, uri ->
println("delay : ${adapter?.delay?.get(i)?.toFloat() ?: 1000f}ms")
val str = contentResolver.openInputStream(uri) ?: return@forEachIndexed
encoder.writeFrame(
str,
delay = adapter?.delay?.get(i)?.toFloat() ?: 1000f
)
}
encoder.writeEnd()
out.close()
val intent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(
this@CreatorActivity,
"${BuildConfig.APPLICATION_ID}.provider",
f
))
// Create a file with the requested MIME type.
type = "image/png"
putExtra(Intent.EXTRA_TITLE, "${items[0].lastPathSegment}.png")
}
startActivity(Intent.createChooser(intent, resources.getText(R.string.share)))
startActivityForResult(intent, WRITE_REQUEST_CODE)
}
true
}
@ -168,6 +209,48 @@ class CreatorActivity : AppCompatActivity() {
}
}
}
WRITE_REQUEST_CODE -> {
if (resultCode == Activity.RESULT_OK) {
if (data?.data != null) {
if (BuildConfig.DEBUG)
Log.i(TAG, "Intent data : ${data.data}")
GlobalScope.launch(Dispatchers.IO) {
val out = contentResolver.openOutputStream(data.data!!) ?: return@launch
var maxWidth = 0
var maxHeight = 0
items.forEach {
val str = contentResolver.openInputStream(it)
val btm = BitmapFactory.decodeStream(str)
if (btm.width > maxWidth)
maxWidth = btm.width
if (btm.height > maxHeight)
maxHeight = btm.height
str?.close()
}
if (BuildConfig.DEBUG)
Log.i(TAG, "MaxWidth : $maxWidth; MaxHeight : $maxHeight")
val encoder = ApngEncoder(out, maxWidth, maxHeight, items.size)
items.forEachIndexed { i, uri ->
// println("delay : ${adapter?.delay?.get(i)?.toFloat() ?: 1000f}ms")
val str = contentResolver.openInputStream(uri) ?: return@forEachIndexed
encoder.writeFrame(
str,
delay = adapter?.delay?.get(i)?.toFloat() ?: 1000f
)
}
encoder.writeEnd()
out.close()
withContext(Dispatchers.Main) {
Snackbar.make(imageRecyclerView, R.string.done, Snackbar.LENGTH_SHORT).show()
}
}
}
}
}
}
}

View File

@ -1,170 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillColor="#26A69A"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
</vector>

View File

@ -1,34 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillType="evenOdd"
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeColor="#00000000"
android:strokeWidth="1">
<aapt:attr name="android:fillColor">
<gradient
android:endX="78.5885"
android:endY="90.9159"
android:startX="48.7653"
android:startY="61.0927"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeColor="#00000000"
android:strokeWidth="1" />
</vector>

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/>
</vector>

View File

@ -2,6 +2,13 @@
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_save_apng"
android:icon="@drawable/ic_save_white_24dp"
android:title="@string/save"
app:showAsAction="ifRoom"
app:iconTint="@color/control"/>
<item
android:id="@+id/menu_create_apng"
android:icon="@drawable/ic_play_arrow_white_24dp"

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -19,4 +19,6 @@
<color name="background">#FFFFFF</color>
<color name="control">#fff</color>
<color name="ic_launcher_background">@color/primary</color>
</resources>

View File

@ -12,7 +12,8 @@
<string name="create">Create</string>
<string name="share">Share</string>
<string name="select_image">Select an image</string>
<string name="save">Save</string>
<string name="done">Done</string>
<string name="open">open</string>
<string name="close">close</string>