Backup before switching to androidx
This commit is contained in:
parent
fb764591be
commit
5235a6b3a4
Binary file not shown.
|
@ -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>
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
|
||||
</project>
|
|
@ -1,11 +1,12 @@
|
|||
apply plugin: 'com.android.library'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply plugin: 'kotlin-android-extensions'
|
||||
|
||||
android {
|
||||
compileSdkVersion 27
|
||||
compileSdkVersion 28
|
||||
defaultConfig {
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 27
|
||||
targetSdkVersion 28
|
||||
versionCode 1
|
||||
versionName "1.0.9"
|
||||
|
||||
|
@ -22,16 +23,15 @@ android {
|
|||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
productFlavors {
|
||||
}
|
||||
}
|
||||
|
||||
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'
|
||||
androidTestImplementation 'com.android.support.test:runner:1.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"
|
||||
|
||||
}
|
||||
|
|
|
@ -111,8 +111,8 @@ class APNGDisassembler {
|
|||
throw BadApng("`y_offset` + `height` must be <= `IHDR` height")
|
||||
}
|
||||
|
||||
png!!.addAll(pngSignature.toList())
|
||||
png!!.addAll(generateIhdr(ihdr, width, height).toList())
|
||||
png?.addAll(pngSignature.toList())
|
||||
png?.addAll(generateIhdr(ihdr, width, height).toList())
|
||||
plte?.let {
|
||||
png!!.addAll(it.toList())
|
||||
}
|
||||
|
|
|
@ -147,8 +147,8 @@ class Apng {
|
|||
res.addAll(generateACTL())
|
||||
|
||||
// Get max height and max width
|
||||
val maxHeight = frames.sortedByDescending { it.height }[0].height
|
||||
val maxWitdh = frames.sortedByDescending { it.width }[0].width
|
||||
maxHeight = frames.sortedByDescending { it.height }[0].height
|
||||
maxWidth = frames.sortedByDescending { it.width }[0].width
|
||||
|
||||
if (cover == null) {
|
||||
val framesByte = ArrayList<Byte>()
|
||||
|
@ -171,24 +171,8 @@ class Apng {
|
|||
fcTL.addAll(to4Bytes(frames[0].width).toList())
|
||||
fcTL.addAll(to4Bytes(frames[0].height).toList())
|
||||
|
||||
// Calculate offset
|
||||
if (frames[0].x_offsets == null) {
|
||||
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())
|
||||
}
|
||||
fcTL.addAll(to4Bytes(frames[0].x_offsets).toList())
|
||||
fcTL.addAll(to4Bytes(frames[0].y_offsets).toList())
|
||||
|
||||
// Set frame delay
|
||||
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].height).toList())
|
||||
|
||||
// Calculate offset
|
||||
if (frames[0].x_offsets == null) {
|
||||
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())
|
||||
}
|
||||
|
||||
fcTL.addAll(to4Bytes(frames[0].x_offsets).toList())
|
||||
fcTL.addAll(to4Bytes(frames[0].y_offsets).toList())
|
||||
|
||||
// Set frame delay
|
||||
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].height).toList())
|
||||
|
||||
if (frames[i].x_offsets == null) {
|
||||
if (frames[i].width < maxWitdh) {
|
||||
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())
|
||||
}
|
||||
fcTL.addAll(to4Bytes(frames[i].x_offsets).toList())
|
||||
fcTL.addAll(to4Bytes(frames[i].y_offsets).toList())
|
||||
|
||||
// Set frame delay
|
||||
fcTL.addAll(to2Bytes(frames[i].delay.toInt()).toList())
|
||||
|
@ -504,9 +458,9 @@ class Apng {
|
|||
val pnn = PnnQuantizer(btm)
|
||||
val btmOptimised = pnn.convert(maxColor, false)
|
||||
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 {
|
||||
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
|
||||
|
@ -520,6 +474,7 @@ class Apng {
|
|||
it.maxHeight = maxHeight
|
||||
}
|
||||
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) {
|
||||
val diffCalculator = BitmapDiffCalculator(drawedFrame[i - 1], drawedFrame[i])
|
||||
File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "frame$i.png").writeBytes(PngEncoder.encode(diffCalculator.res, true))
|
||||
|
|
|
@ -5,11 +5,11 @@ apply plugin: 'kotlin-android'
|
|||
apply plugin: 'kotlin-android-extensions'
|
||||
|
||||
android {
|
||||
compileSdkVersion 27
|
||||
compileSdkVersion 28
|
||||
defaultConfig {
|
||||
applicationId "oupson.apngcreator"
|
||||
minSdkVersion 24
|
||||
targetSdkVersion 26
|
||||
targetSdkVersion 28
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
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 "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"
|
||||
}
|
||||
kotlin {
|
||||
experimental {
|
||||
|
|
|
@ -2,12 +2,10 @@ package oupson.apngcreator
|
|||
|
||||
import android.support.test.InstrumentationRegistry
|
||||
import android.support.test.runner.AndroidJUnit4
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
import org.junit.Assert.*
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
|
|
|
@ -2,14 +2,19 @@ package oupson.apngcreator
|
|||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.content.res.ColorStateList
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.BitmapFactory
|
||||
import android.graphics.Color
|
||||
import android.os.Bundle
|
||||
import android.os.Environment
|
||||
import android.support.design.widget.FloatingActionButton
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import android.text.Html
|
||||
import android.view.View
|
||||
import android.widget.ListView
|
||||
import org.jetbrains.anko.*
|
||||
import org.jetbrains.anko.design.appBarLayout
|
||||
import org.jetbrains.anko.design.floatingActionButton
|
||||
import org.jetbrains.anko.sdk27.coroutines.onClick
|
||||
import oupson.apng.Apng
|
||||
|
@ -22,6 +27,7 @@ class CreatorActivity : AppCompatActivity() {
|
|||
var bitmapAdapter : AnkoAdapter<Bitmap>? = null
|
||||
val PICK_IMAGE = 999
|
||||
var view = CreatorActivityLayout()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
view.setContentView(this)
|
||||
|
@ -38,7 +44,7 @@ class CreatorActivity : AppCompatActivity() {
|
|||
startActivityForResult(chooserIntent, PICK_IMAGE)
|
||||
}
|
||||
view.createButton.onClick {
|
||||
var apngCreated = Apng()
|
||||
val apngCreated = Apng()
|
||||
|
||||
items.forEach { bitmap ->
|
||||
apngCreated.addFrames(bitmap)
|
||||
|
@ -54,23 +60,16 @@ class CreatorActivity : AppCompatActivity() {
|
|||
a.load(apngCreated.toByteArray())
|
||||
a.onLoaded { anim ->
|
||||
alert {
|
||||
customView {
|
||||
imageView {
|
||||
/**anim.anim?.let {cu ->
|
||||
for (i in 0 until cu.numberOfFrames) {
|
||||
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)
|
||||
}
|
||||
customView {
|
||||
ctx.setTheme(R.style.AppTheme_DarkDialog)
|
||||
imageView {
|
||||
this.setImageDrawable(anim.anim)
|
||||
}
|
||||
}.show()
|
||||
}
|
||||
|
||||
}
|
||||
}.show()
|
||||
}
|
||||
}
|
||||
bitmapAdapter = AnkoAdapter({items}) {index, items, view ->
|
||||
with(items[index]) {
|
||||
verticalLayout {
|
||||
|
@ -112,13 +111,39 @@ class CreatorActivityLayout : AnkoComponent<CreatorActivity> {
|
|||
|
||||
override fun createView(ui: AnkoContext<CreatorActivity>) = with(ui) {
|
||||
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 {
|
||||
id = View.generateViewId()
|
||||
}.lparams {
|
||||
width = matchParent
|
||||
height = matchParent
|
||||
below(bar)
|
||||
}
|
||||
addFrameButton = floatingActionButton {
|
||||
imageResource = R.drawable.ic_add_white_24dp
|
||||
imageResource = R.drawable.ic_add_black_24dp
|
||||
backgroundTintList = ColorStateList.valueOf(Color.WHITE)
|
||||
isClickable = true
|
||||
}.lparams {
|
||||
width = wrapContent
|
||||
|
@ -128,7 +153,8 @@ class CreatorActivityLayout : AnkoComponent<CreatorActivity> {
|
|||
alignParentEnd()
|
||||
}
|
||||
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
|
||||
}.lparams {
|
||||
width = wrapContent
|
||||
|
|
|
@ -2,21 +2,35 @@ package oupson.apngcreator
|
|||
|
||||
import android.Manifest
|
||||
import android.content.pm.PackageManager
|
||||
import android.graphics.Color
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.ActivityCompat
|
||||
import android.support.v4.content.ContextCompat
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
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.verticalLayout
|
||||
import oupson.apng.ApngAnimator
|
||||
|
||||
|
||||
class Main2Activity : AppCompatActivity() {
|
||||
|
||||
lateinit var imageView : ImageView
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
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
|
||||
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
||||
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||
|
@ -38,10 +52,10 @@ class Main2Activity : AppCompatActivity() {
|
|||
}
|
||||
|
||||
fun load() {
|
||||
val animator = ApngAnimator(applicationContext).loadInto(imageView3)
|
||||
val animator = ApngAnimator(applicationContext).loadInto(imageView)
|
||||
val uri = intent.data
|
||||
animator.load(uri, null)
|
||||
imageView3.onClick {
|
||||
imageView.onClick {
|
||||
try {
|
||||
if (animator.isPlaying) {
|
||||
animator.pause()
|
||||
|
|
|
@ -1,75 +1,181 @@
|
|||
package oupson.apngcreator
|
||||
|
||||
import android.content.Intent
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.GradientDrawable
|
||||
import android.os.Bundle
|
||||
import android.support.constraint.ConstraintLayout
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import android.text.Html
|
||||
import android.util.Log
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.widget.SeekBar
|
||||
import android.view.View
|
||||
import android.widget.Toolbar
|
||||
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
|
||||
|
||||
|
||||
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 = "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 = "https://raw.githubusercontent.com/tinify/iMessage-Panda-sticker/master/StickerPackExtension/Stickers.xcstickers/Sticker%20Pack.stickerpack/panda.sticker/panda.png"
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_main)
|
||||
animator = ApngAnimator(this).loadInto(imageView).apply {
|
||||
load(imageUrl)
|
||||
onLoaded {
|
||||
setOnAnimationLoopListener {
|
||||
// Log.e("app-test", "onLoop")
|
||||
val buttonDrawable = GradientDrawable().apply {
|
||||
shape = GradientDrawable.RECTANGLE
|
||||
cornerRadius = dip(5).toFloat()
|
||||
setStroke(2, Color.WHITE)
|
||||
}
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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: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>
|
|
@ -4,6 +4,6 @@
|
|||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:fillColor="#000"
|
||||
android:pathData="M8,5v14l11,-7z"/>
|
||||
</vector>
|
|
@ -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>
|
|
@ -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>
|
|
@ -3,9 +3,31 @@
|
|||
<!-- Base application theme. -->
|
||||
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||
<!-- Customize your theme here. -->
|
||||
<item name="colorPrimary">#ff00</item>
|
||||
<item name="colorPrimaryDark">#0000ff</item>
|
||||
<item name="colorAccent">#ff00</item>
|
||||
<item name="colorPrimary">#000</item>
|
||||
<item name="colorPrimaryDark">#000</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>
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
package oupson.apngcreator
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
import org.junit.Assert.*
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.3.11'
|
||||
ext.kotlin_version = '1.3.31'
|
||||
ext.anko_version = '0.10.8'
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
}
|
||||
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"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#Tue Sep 25 21:36:02 CEST 2018
|
||||
#Fri May 17 18:01:19 CEST 2019
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue