Backup before switching to androidx

This commit is contained in:
oupson 2019-05-17 18:17:47 +02:00
parent fb764591be
commit 5235a6b3a4
20 changed files with 284 additions and 280 deletions

View File

@ -1,29 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<Objective-C-extensions>
<file>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
</file>
<class>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
</class>
<extensions>
<pair source="cpp" header="h" fileNamingConvention="NONE" />
<pair source="c" header="h" fileNamingConvention="NONE" />
</extensions>
</Objective-C-extensions>
</code_scheme>
</component>

4
.idea/encodings.xml Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>

View File

@ -1,11 +1,12 @@
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android { android {
compileSdkVersion 27 compileSdkVersion 28
defaultConfig { defaultConfig {
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 27 targetSdkVersion 28
versionCode 1 versionCode 1
versionName "1.0.9" versionName "1.0.9"
@ -22,16 +23,15 @@ android {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
} }
productFlavors {
}
} }
dependencies { dependencies {
implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:appcompat-v7:28.0.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
testImplementation 'junit:junit:4.12' testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "org.jetbrains.anko:anko:$anko_version" implementation "org.jetbrains.anko:anko:$anko_version"
} }

View File

@ -111,8 +111,8 @@ class APNGDisassembler {
throw BadApng("`y_offset` + `height` must be <= `IHDR` height") throw BadApng("`y_offset` + `height` must be <= `IHDR` height")
} }
png!!.addAll(pngSignature.toList()) png?.addAll(pngSignature.toList())
png!!.addAll(generateIhdr(ihdr, width, height).toList()) png?.addAll(generateIhdr(ihdr, width, height).toList())
plte?.let { plte?.let {
png!!.addAll(it.toList()) png!!.addAll(it.toList())
} }

View File

@ -147,8 +147,8 @@ class Apng {
res.addAll(generateACTL()) res.addAll(generateACTL())
// Get max height and max width // Get max height and max width
val maxHeight = frames.sortedByDescending { it.height }[0].height maxHeight = frames.sortedByDescending { it.height }[0].height
val maxWitdh = frames.sortedByDescending { it.width }[0].width maxWidth = frames.sortedByDescending { it.width }[0].width
if (cover == null) { if (cover == null) {
val framesByte = ArrayList<Byte>() val framesByte = ArrayList<Byte>()
@ -171,24 +171,8 @@ class Apng {
fcTL.addAll(to4Bytes(frames[0].width).toList()) fcTL.addAll(to4Bytes(frames[0].width).toList())
fcTL.addAll(to4Bytes(frames[0].height).toList()) fcTL.addAll(to4Bytes(frames[0].height).toList())
// Calculate offset fcTL.addAll(to4Bytes(frames[0].x_offsets).toList())
if (frames[0].x_offsets == null) { fcTL.addAll(to4Bytes(frames[0].y_offsets).toList())
if (frames[0].width < maxWitdh) {
val xOffset = (maxWitdh / 2) - (frames[0].width / 2)
fcTL.addAll(to4Bytes(xOffset).toList())
} else {
fcTL.addAll(to4Bytes(0).toList())
}
if (frames[0].height < maxHeight) {
val xOffset = (maxHeight / 2) - (frames[0].height / 2)
fcTL.addAll(to4Bytes(xOffset).toList())
} else {
fcTL.addAll(to4Bytes(0).toList())
}
} else {
fcTL.addAll(to4Bytes(frames[0].x_offsets).toList())
fcTL.addAll(to4Bytes(frames[0].y_offsets).toList())
}
// Set frame delay // Set frame delay
fcTL.addAll(to2Bytes(frames[0].delay.toInt()).toList()) fcTL.addAll(to2Bytes(frames[0].delay.toInt()).toList())
@ -255,24 +239,9 @@ class Apng {
fcTL.addAll(to4Bytes(frames[0].width).toList()) fcTL.addAll(to4Bytes(frames[0].width).toList())
fcTL.addAll(to4Bytes(frames[0].height).toList()) fcTL.addAll(to4Bytes(frames[0].height).toList())
// Calculate offset
if (frames[0].x_offsets == null) { fcTL.addAll(to4Bytes(frames[0].x_offsets).toList())
if (frames[0].width < maxWitdh) { fcTL.addAll(to4Bytes(frames[0].y_offsets).toList())
val xOffset = (maxWitdh / 2) - (frames[0].width / 2)
fcTL.addAll(to4Bytes(xOffset).toList())
} else {
fcTL.addAll(to4Bytes(0).toList())
}
if (frames[0].height < maxHeight) {
val xOffset = (maxHeight / 2) - (frames[0].height / 2)
fcTL.addAll(to4Bytes(xOffset).toList())
} else {
fcTL.addAll(to4Bytes(0).toList())
}
} else {
fcTL.addAll(to4Bytes(frames[0].x_offsets!!).toList())
fcTL.addAll(to4Bytes(frames[0].y_offsets!!).toList())
}
// Set frame delay // Set frame delay
fcTL.addAll(to2Bytes(frames[0].delay.toInt()).toList()) fcTL.addAll(to2Bytes(frames[0].delay.toInt()).toList())
@ -326,23 +295,8 @@ class Apng {
fcTL.addAll(to4Bytes(frames[i].width).toList()) fcTL.addAll(to4Bytes(frames[i].width).toList())
fcTL.addAll(to4Bytes(frames[i].height).toList()) fcTL.addAll(to4Bytes(frames[i].height).toList())
if (frames[i].x_offsets == null) { fcTL.addAll(to4Bytes(frames[i].x_offsets).toList())
if (frames[i].width < maxWitdh) { fcTL.addAll(to4Bytes(frames[i].y_offsets).toList())
val xOffset = (maxWitdh / 2) - (frames[i].width / 2)
fcTL.addAll(to4Bytes(xOffset).toList())
} else {
fcTL.addAll(to4Bytes(0).toList())
}
if (frames[i].height < maxHeight) {
val xOffset = (maxHeight / 2) - (frames[i].height / 2)
fcTL.addAll(to4Bytes(xOffset).toList())
} else {
fcTL.addAll(to4Bytes(0).toList())
}
} else {
fcTL.addAll(to4Bytes(frames[i].x_offsets!!).toList())
fcTL.addAll(to4Bytes(frames[i].y_offsets!!).toList())
}
// Set frame delay // Set frame delay
fcTL.addAll(to2Bytes(frames[i].delay.toInt()).toList()) fcTL.addAll(to2Bytes(frames[i].delay.toInt()).toList())
@ -504,9 +458,9 @@ class Apng {
val pnn = PnnQuantizer(btm) val pnn = PnnQuantizer(btm)
val btmOptimised = pnn.convert(maxColor, false) val btmOptimised = pnn.convert(maxColor, false)
if (sizePercent != null) { if (sizePercent != null) {
apng.addFrames(btmOptimised, it.delay, ((it.x_offsets ?: 0).toFloat() * sizePercent.toFloat() / 100f).toInt(), ((it.y_offsets ?: 0).toFloat() * sizePercent.toFloat() / 100f).toInt(), it.dispose_op, it.blend_op) apng.addFrames(btmOptimised, it.delay, (it.x_offsets.toFloat() * sizePercent.toFloat() / 100f).toInt(), (it.y_offsets.toFloat() * sizePercent.toFloat() / 100f).toInt(), it.dispose_op, it.blend_op)
} else { } else {
apng.addFrames(btmOptimised, it.delay, it.x_offsets ?: 0, it.y_offsets ?: 0, it.dispose_op, it.blend_op) apng.addFrames(btmOptimised, it.delay, it.x_offsets, it.y_offsets, it.dispose_op, it.blend_op)
} }
} }
frames = apng.frames frames = apng.frames
@ -520,6 +474,7 @@ class Apng {
it.maxHeight = maxHeight it.maxHeight = maxHeight
} }
val drawedFrame = ApngAnimator(null).draw(frames) val drawedFrame = ApngAnimator(null).draw(frames)
File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "frame0.png").writeBytes(PngEncoder.encode(drawedFrame[0]))
for (i in 1 until frames.size) { for (i in 1 until frames.size) {
val diffCalculator = BitmapDiffCalculator(drawedFrame[i - 1], drawedFrame[i]) val diffCalculator = BitmapDiffCalculator(drawedFrame[i - 1], drawedFrame[i])
File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "frame$i.png").writeBytes(PngEncoder.encode(diffCalculator.res, true)) File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "frame$i.png").writeBytes(PngEncoder.encode(diffCalculator.res, true))

View File

@ -5,11 +5,11 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-android-extensions'
android { android {
compileSdkVersion 27 compileSdkVersion 28
defaultConfig { defaultConfig {
applicationId "oupson.apngcreator" applicationId "oupson.apngcreator"
minSdkVersion 24 minSdkVersion 24
targetSdkVersion 26 targetSdkVersion 28
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
@ -48,6 +48,7 @@ dependencies {
implementation 'com.android.support:design:27.1.1' // where X.X.X version implementation 'com.android.support:design:27.1.1' // where X.X.X version
implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version" implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
implementation "org.jetbrains.anko:anko-design:$anko_version" implementation "org.jetbrains.anko:anko-design:$anko_version"
implementation "org.jetbrains.anko:anko-constraint-layout:$anko_version"
} }
kotlin { kotlin {
experimental { experimental {

View File

@ -2,12 +2,10 @@ package oupson.apngcreator
import android.support.test.InstrumentationRegistry import android.support.test.InstrumentationRegistry
import android.support.test.runner.AndroidJUnit4 import android.support.test.runner.AndroidJUnit4
import org.junit.Assert.assertEquals
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.junit.Assert.*
/** /**
* Instrumented test, which will execute on an Android device. * Instrumented test, which will execute on an Android device.
* *

View File

@ -2,14 +2,19 @@ package oupson.apngcreator
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.content.res.ColorStateList
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import android.support.design.widget.FloatingActionButton import android.support.design.widget.FloatingActionButton
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import android.text.Html
import android.view.View
import android.widget.ListView import android.widget.ListView
import org.jetbrains.anko.* import org.jetbrains.anko.*
import org.jetbrains.anko.design.appBarLayout
import org.jetbrains.anko.design.floatingActionButton import org.jetbrains.anko.design.floatingActionButton
import org.jetbrains.anko.sdk27.coroutines.onClick import org.jetbrains.anko.sdk27.coroutines.onClick
import oupson.apng.Apng import oupson.apng.Apng
@ -22,6 +27,7 @@ class CreatorActivity : AppCompatActivity() {
var bitmapAdapter : AnkoAdapter<Bitmap>? = null var bitmapAdapter : AnkoAdapter<Bitmap>? = null
val PICK_IMAGE = 999 val PICK_IMAGE = 999
var view = CreatorActivityLayout() var view = CreatorActivityLayout()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
view.setContentView(this) view.setContentView(this)
@ -38,7 +44,7 @@ class CreatorActivity : AppCompatActivity() {
startActivityForResult(chooserIntent, PICK_IMAGE) startActivityForResult(chooserIntent, PICK_IMAGE)
} }
view.createButton.onClick { view.createButton.onClick {
var apngCreated = Apng() val apngCreated = Apng()
items.forEach { bitmap -> items.forEach { bitmap ->
apngCreated.addFrames(bitmap) apngCreated.addFrames(bitmap)
@ -54,23 +60,16 @@ class CreatorActivity : AppCompatActivity() {
a.load(apngCreated.toByteArray()) a.load(apngCreated.toByteArray())
a.onLoaded { anim -> a.onLoaded { anim ->
alert { alert {
customView { customView {
imageView { ctx.setTheme(R.style.AppTheme_DarkDialog)
/**anim.anim?.let {cu -> imageView {
for (i in 0 until cu.numberOfFrames) { this.setImageDrawable(anim.anim)
val vt = Bitmap.createBitmap(cu.getFrame(i).intrinsicWidth, cu.getFrame(i).intrinsicHeight, Bitmap.Config.ARGB_8888)
val canvas = Canvas(vt)
cu.getFrame(i).draw(canvas)
File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "frameCreated$i.png").writeBytes(PngEncoder.encode(vt))
}
}
*/
this.setImageDrawable(anim.anim)
}
} }
}.show()
} }
}.show()
} }
}
bitmapAdapter = AnkoAdapter({items}) {index, items, view -> bitmapAdapter = AnkoAdapter({items}) {index, items, view ->
with(items[index]) { with(items[index]) {
verticalLayout { verticalLayout {
@ -112,13 +111,39 @@ class CreatorActivityLayout : AnkoComponent<CreatorActivity> {
override fun createView(ui: AnkoContext<CreatorActivity>) = with(ui) { override fun createView(ui: AnkoContext<CreatorActivity>) = with(ui) {
relativeLayout { relativeLayout {
backgroundColor = Color.BLACK
var bar = verticalLayout {
id = View.generateViewId()
backgroundColor = Color.DKGRAY
appBarLayout {
backgroundColor = Color.BLACK
toolbar {
id = View.generateViewId()
title = Html.fromHtml("<font color='#ffffff'>Create APNG</font>")
}.lparams {
width = matchParent
height = wrapContent
}
}.lparams {
width = matchParent
height = wrapContent
bottomMargin = 1
}
}.lparams {
width = matchParent
height = wrapContent
}
listView = listView { listView = listView {
id = View.generateViewId()
}.lparams { }.lparams {
width = matchParent width = matchParent
height = matchParent height = matchParent
below(bar)
} }
addFrameButton = floatingActionButton { addFrameButton = floatingActionButton {
imageResource = R.drawable.ic_add_white_24dp imageResource = R.drawable.ic_add_black_24dp
backgroundTintList = ColorStateList.valueOf(Color.WHITE)
isClickable = true isClickable = true
}.lparams { }.lparams {
width = wrapContent width = wrapContent
@ -128,7 +153,8 @@ class CreatorActivityLayout : AnkoComponent<CreatorActivity> {
alignParentEnd() alignParentEnd()
} }
createButton = floatingActionButton { createButton = floatingActionButton {
imageResource = R.drawable.ic_play_arrow_white_24dp imageResource = R.drawable.ic_play_arrow_black_24dp
backgroundTintList = ColorStateList.valueOf(Color.WHITE)
isClickable = true isClickable = true
}.lparams { }.lparams {
width = wrapContent width = wrapContent

View File

@ -2,21 +2,35 @@ package oupson.apngcreator
import android.Manifest import android.Manifest
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.support.v4.app.ActivityCompat import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat import android.support.v4.content.ContextCompat
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import android.view.View import android.view.View
import kotlinx.android.synthetic.main.activity_main2.* import android.widget.ImageView
import org.jetbrains.anko.backgroundColor
import org.jetbrains.anko.imageView
import org.jetbrains.anko.matchParent
import org.jetbrains.anko.sdk27.coroutines.onClick import org.jetbrains.anko.sdk27.coroutines.onClick
import org.jetbrains.anko.verticalLayout
import oupson.apng.ApngAnimator import oupson.apng.ApngAnimator
class Main2Activity : AppCompatActivity() { class Main2Activity : AppCompatActivity() {
lateinit var imageView : ImageView
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
verticalLayout {
imageView = imageView {
}.lparams {
width = matchParent
height = matchParent
}
backgroundColor = Color.parseColor("#323232")
}
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
@ -38,10 +52,10 @@ class Main2Activity : AppCompatActivity() {
} }
fun load() { fun load() {
val animator = ApngAnimator(applicationContext).loadInto(imageView3) val animator = ApngAnimator(applicationContext).loadInto(imageView)
val uri = intent.data val uri = intent.data
animator.load(uri, null) animator.load(uri, null)
imageView3.onClick { imageView.onClick {
try { try {
if (animator.isPlaying) { if (animator.isPlaying) {
animator.pause() animator.pause()

View File

@ -1,75 +1,181 @@
package oupson.apngcreator package oupson.apngcreator
import android.content.Intent import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import android.os.Bundle import android.os.Bundle
import android.support.constraint.ConstraintLayout
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import android.text.Html
import android.util.Log import android.util.Log
import android.view.Menu import android.view.View
import android.view.MenuItem import android.widget.Toolbar
import android.widget.SeekBar
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_main.* import org.jetbrains.anko.*
import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder
import org.jetbrains.anko.constraint.layout.applyConstraintSet
import org.jetbrains.anko.constraint.layout.constraintLayout
import org.jetbrains.anko.constraint.layout.matchConstraint
import org.jetbrains.anko.design.appBarLayout
import org.jetbrains.anko.sdk27.coroutines.onClick
import org.jetbrains.anko.sdk27.coroutines.onMenuItemClick
import org.jetbrains.anko.sdk27.coroutines.onSeekBarChangeListener
import oupson.apng.ApngAnimator import oupson.apng.ApngAnimator
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
lateinit var animator: ApngAnimator
lateinit var animator: ApngAnimator
lateinit var tool : Toolbar
// val imageUrl = "http://oupson.oupsman.fr/apng/bigApng.png" // val imageUrl = "http://oupson.oupsman.fr/apng/bigApng.png"
// val imageUrl = "https://metagif.files.wordpress.com/2015/01/bugbuckbunny.png" // val imageUrl = "https://metagif.files.wordpress.com/2015/01/bugbuckbunny.png"
val imageUrl = "http://orig06.deviantart.net/7812/f/2012/233/7/5/twilight_rapidash_shaded_and_animated_by_tamalesyatole-d5bz7hd.png" val imageUrl = "http://orig06.deviantart.net/7812/f/2012/233/7/5/twilight_rapidash_shaded_and_animated_by_tamalesyatole-d5bz7hd.png"
// val imageUrl = "https://raw.githubusercontent.com/tinify/iMessage-Panda-sticker/master/StickerPackExtension/Stickers.xcstickers/Sticker%20Pack.stickerpack/panda.sticker/panda.png" // val imageUrl = "https://raw.githubusercontent.com/tinify/iMessage-Panda-sticker/master/StickerPackExtension/Stickers.xcstickers/Sticker%20Pack.stickerpack/panda.sticker/panda.png"
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) val buttonDrawable = GradientDrawable().apply {
animator = ApngAnimator(this).loadInto(imageView).apply { shape = GradientDrawable.RECTANGLE
load(imageUrl) cornerRadius = dip(5).toFloat()
onLoaded { setStroke(2, Color.WHITE)
setOnAnimationLoopListener { }
// Log.e("app-test", "onLoop") verticalLayout {
backgroundColor = Color.BLACK
verticalLayout {
backgroundColor = Color.DKGRAY
appBarLayout {
backgroundColor = Color.BLACK
tool = toolbar {
id = View.generateViewId()
title = Html.fromHtml("<font color='#ffffff'>MainActivity</font>")
inflateMenu(R.menu.main_menu)
onMenuItemClick { item ->
Log.e("lll", "Click")
when (item!!.itemId) {
R.id.action_open_create_activity -> {
Log.e("lll", "Click")
startActivity<CreatorActivity>()
finish()
true
}
else -> false
}
}
}.lparams {
width = matchParent
height = wrapContent
}
}.lparams {
width = matchParent
height = wrapContent
bottomMargin = 1
} }
}.lparams {
width = matchParent
height = wrapContent
} }
constraintLayout {
val pauseButton = button("pause") {
id = View.generateViewId()
background = buttonDrawable
onClick {
animator.pause()
}
}.lparams(
width = wrapContent,
height = wrapContent
)
val playButton = button("play") {
background = buttonDrawable
id = View.generateViewId()
onClick {
animator.play()
}
}.lparams(
width = wrapContent,
height = wrapContent
)
val seekBar = themedSeekBar(R.style.AppTheme_SeekBar){
id = View.generateViewId()
max = 200
progress = 10
onSeekBarChangeListener {
onProgressChanged { seekBar, progressValue, fromUser -> }
onStartTrackingTouch { seekBar -> }
onStopTrackingTouch { seekBar ->
Log.e("TAG", (seekBar!!.progress.toFloat() / 100f).toString())
animator.speed = (seekBar!!.progress.toFloat() / 100f)
}
}
}.lparams(
width = matchConstraint,
height = wrapContent
)
val imageView2 = imageView {
id = View.generateViewId()
Picasso.get().load(imageUrl).into(this)
}.lparams(
width = matchConstraint,
height = matchConstraint
)
val imageView = imageView {
id = View.generateViewId()
animator = ApngAnimator(this@MainActivity).loadInto(this).apply {
load(imageUrl)
onLoaded {
setOnAnimationLoopListener {
// Log.e("app-test", "onLoop")
}
}
}
}.lparams(
width = matchConstraint,
height = matchConstraint
)
applyConstraintSet {
pauseButton {
connect(
ConstraintSetBuilder.Side.BOTTOM to ConstraintSetBuilder.Side.TOP of seekBar margin dip(8),
ConstraintSetBuilder.Side.END to ConstraintSetBuilder.Side.END of ConstraintLayout.LayoutParams.PARENT_ID margin dip(8)
)
}
playButton {
connect(
ConstraintSetBuilder.Side.BOTTOM to ConstraintSetBuilder.Side.TOP of seekBar margin dip(8),
ConstraintSetBuilder.Side.START to ConstraintSetBuilder.Side.START of ConstraintLayout.LayoutParams.PARENT_ID margin dip(8)
)
}
seekBar {
connect(
ConstraintSetBuilder.Side.BOTTOM to ConstraintSetBuilder.Side.BOTTOM of ConstraintLayout.LayoutParams.PARENT_ID margin dip(8),
ConstraintSetBuilder.Side.END to ConstraintSetBuilder.Side.END of ConstraintLayout.LayoutParams.PARENT_ID margin dip(8),
ConstraintSetBuilder.Side.START to ConstraintSetBuilder.Side.START of ConstraintLayout.LayoutParams.PARENT_ID margin dip(8)
)
}
imageView2 {
connect(
ConstraintSetBuilder.Side.BOTTOM to ConstraintSetBuilder.Side.TOP of playButton margin dip(8),
ConstraintSetBuilder.Side.END to ConstraintSetBuilder.Side.END of ConstraintLayout.LayoutParams.PARENT_ID margin dip(8),
ConstraintSetBuilder.Side.START to ConstraintSetBuilder.Side.START of ConstraintLayout.LayoutParams.PARENT_ID margin dip(8),
ConstraintSetBuilder.Side.TOP to ConstraintSetBuilder.Side.BOTTOM of imageView
)
}
imageView {
connect(
ConstraintSetBuilder.Side.BOTTOM to ConstraintSetBuilder.Side.TOP of imageView2 margin dip(8),
ConstraintSetBuilder.Side.END to ConstraintSetBuilder.Side.END of ConstraintLayout.LayoutParams.PARENT_ID margin dip(8),
ConstraintSetBuilder.Side.START to ConstraintSetBuilder.Side.START of ConstraintLayout.LayoutParams.PARENT_ID margin dip(8),
ConstraintSetBuilder.Side.TOP to ConstraintSetBuilder.Side.TOP of ConstraintLayout.LayoutParams.PARENT_ID margin dip(8)
)
}
}
}.lparams {
width = matchParent
height = matchParent
}
} }
this.seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar, progressValue: Int, fromUser: Boolean) {
}
override fun onStartTrackingTouch(seekBar: SeekBar) {
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
Log.e("TAG" , (seekBar.progress.toFloat() / 100f).toString())
animator.speed = (seekBar.progress.toFloat() / 100f)
}
})
Picasso.get().load(imageUrl).into(imageView2)
play.setOnClickListener {
animator.play()
}
pause.setOnClickListener {
animator.pause()
}
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main_menu, menu)
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when(item?.itemId) {
R.id.action_open_create_activity -> {
val intent = Intent(this, CreatorActivity::class.java)
startActivity(intent)
finish()
}
}
return super.onOptionsItemSelected(item)
} }
} }

View File

@ -1,5 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF" <vector android:height="24dp" android:tint="#000"
android:viewportHeight="24.0" android:viewportWidth="24.0" android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/> <path android:fillColor="#000" android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
</vector> </vector>

View File

@ -4,6 +4,6 @@
android:viewportWidth="24.0" android:viewportWidth="24.0"
android:viewportHeight="24.0"> android:viewportHeight="24.0">
<path <path
android:fillColor="#ffffff" android:fillColor="#000"
android:pathData="M8,5v14l11,-7z"/> android:pathData="M8,5v14l11,-7z"/>
</vector> </vector>

View File

@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="pause"
app:layout_constraintBottom_toTopOf="@+id/seekBar"
app:layout_constraintEnd_toEndOf="parent" />
<Button
android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
android:text="play"
app:layout_constraintBottom_toTopOf="@+id/seekBar"
app:layout_constraintStart_toStartOf="parent" />
<SeekBar
android:id="@+id/seekBar"
style="@style/Widget.AppCompat.SeekBar.Discrete"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="4dp"
android:max="200"
android:progress="10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintBottom_toTopOf="@+id/play"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView"
app:srcCompat="@android:color/transparent" />
<ImageView
android:id="@+id/imageView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintBottom_toTopOf="@+id/imageView2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@android:color/transparent" />
</android.support.constraint.ConstraintLayout>

View File

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/constraint"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#323232"
tools:context=".Main2Activity">
<ImageView
android:id="@+id/imageView3"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@android:color/transparent" />
</android.support.constraint.ConstraintLayout>

View File

@ -3,9 +3,31 @@
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
<item name="colorPrimary">#ff00</item> <item name="colorPrimary">#000</item>
<item name="colorPrimaryDark">#0000ff</item> <item name="colorPrimaryDark">#000</item>
<item name="colorAccent">#ff00</item> <item name="colorAccent">#fff</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:textColorPrimary">#ffffff</item>
<item name="actionMenuTextColor">#fff</item>
<item name="android:itemBackground">#000</item>
<item name="android:textColorSecondary">#fff</item>
<item name="android:colorEdgeEffect">#fff</item>
</style>
<style name="AppTheme.SeekBar" parent="Widget.AppCompat.SeekBar">
<item name="android:progressBackgroundTint">#999999</item>
<item name="android:progressTint">#fff</item>
<item name="android:colorControlActivated">#fff</item>
</style>
<style name="AppTheme.DarkDialog" parent="Theme.AppCompat.Dialog.Alert">
<!-- Used for the buttons -->
<item name="colorAccent">#fff</item>
<!-- Used for the title and text -->
<item name="android:textColorPrimary">#FFFFFF</item>
<!-- Used for the background -->
<item name="android:background">#000</item>
</style> </style>
</resources> </resources>

View File

@ -1,9 +1,8 @@
package oupson.apngcreator package oupson.apngcreator
import org.junit.Assert.assertEquals
import org.junit.Test import org.junit.Test
import org.junit.Assert.*
/** /**
* Example local unit test, which will execute on the development machine (host). * Example local unit test, which will execute on the development machine (host).
* *

View File

@ -1,14 +1,14 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = '1.3.11' ext.kotlin_version = '1.3.31'
ext.anko_version = '0.10.8' ext.anko_version = '0.10.8'
repositories { repositories {
google() google()
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.2.1' classpath 'com.android.tools.build:gradle:3.4.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong

View File

@ -10,4 +10,4 @@ org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode. # When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit # This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true # org.gradle.parallel=true

View File

@ -1,6 +1,6 @@
#Tue Sep 25 21:36:02 CEST 2018 #Fri May 17 18:01:19 CEST 2019
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip