Fix a bug with max height
New icon for app Working on creator activity
|
@ -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>
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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'
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 769 B |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.7 KiB |
After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 7.4 KiB |
After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 7.4 KiB |
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 11 KiB |
|
@ -19,4 +19,6 @@
|
|||
<color name="background">#FFFFFF</color>
|
||||
|
||||
<color name="control">#fff</color>
|
||||
|
||||
<color name="ic_launcher_background">@color/primary</color>
|
||||
</resources>
|
||||
|
|
|
@ -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>
|
||||
|
|