Add java activity
This commit is contained in:
parent
b4d40c5764
commit
84c97fb106
Binary file not shown.
|
@ -1,11 +1,15 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
|
<component name="JavadocGenerationManager">
|
||||||
|
<option name="OUTPUT_DIRECTORY" value="$USER_HOME$/Downloads/javadoc" />
|
||||||
|
<option name="OPTION_SCOPE" value="package" />
|
||||||
|
</component>
|
||||||
<component name="NullableNotNullManager">
|
<component name="NullableNotNullManager">
|
||||||
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
|
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
|
||||||
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
|
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
|
||||||
<option name="myNullables">
|
<option name="myNullables">
|
||||||
<value>
|
<value>
|
||||||
<list size="7">
|
<list size="10">
|
||||||
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
|
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
|
||||||
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
|
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
|
||||||
<item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
|
<item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
|
||||||
|
@ -13,18 +17,24 @@
|
||||||
<item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
|
<item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
|
||||||
<item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
|
<item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
|
||||||
<item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
|
<item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
|
||||||
|
<item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
|
||||||
|
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
|
||||||
|
<item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</option>
|
</option>
|
||||||
<option name="myNotNulls">
|
<option name="myNotNulls">
|
||||||
<value>
|
<value>
|
||||||
<list size="6">
|
<list size="9">
|
||||||
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
|
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
|
||||||
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
|
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
|
||||||
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
|
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
|
||||||
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
|
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
|
||||||
<item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
|
<item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
|
||||||
<item index="5" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
|
<item index="5" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
|
||||||
|
<item index="6" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
|
||||||
|
<item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
|
||||||
|
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</option>
|
</option>
|
||||||
|
|
|
@ -37,4 +37,4 @@ dependencies {
|
||||||
}
|
}
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
|
@ -24,6 +24,7 @@ import java.net.URL
|
||||||
* @return [ApngAnimator] The animator
|
* @return [ApngAnimator] The animator
|
||||||
*/
|
*/
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
|
@JvmOverloads
|
||||||
fun ImageView.loadApng(file: File, speed: Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) = ApngAnimator(this.context).loadInto(this).apply {
|
fun ImageView.loadApng(file: File, speed: Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) = ApngAnimator(this.context).loadInto(this).apply {
|
||||||
load(file, speed, apngAnimatorOptions)
|
load(file, speed, apngAnimatorOptions)
|
||||||
}
|
}
|
||||||
|
@ -35,6 +36,7 @@ fun ImageView.loadApng(file: File, speed: Float? = null, apngAnimatorOptions: Ap
|
||||||
* @return [ApngAnimator] The animator
|
* @return [ApngAnimator] The animator
|
||||||
*/
|
*/
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
|
@JvmOverloads
|
||||||
fun ImageView.loadApng(uri : Uri, speed: Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) = ApngAnimator(this.context).loadInto(this).apply {
|
fun ImageView.loadApng(uri : Uri, speed: Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) = ApngAnimator(this.context).loadInto(this).apply {
|
||||||
load(uri, speed, apngAnimatorOptions)
|
load(uri, speed, apngAnimatorOptions)
|
||||||
}
|
}
|
||||||
|
@ -46,6 +48,7 @@ fun ImageView.loadApng(uri : Uri, speed: Float? = null, apngAnimatorOptions: Apn
|
||||||
* @return [ApngAnimator] The animator
|
* @return [ApngAnimator] The animator
|
||||||
*/
|
*/
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
|
@JvmOverloads
|
||||||
fun ImageView.loadApng(url: URL, speed: Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) = ApngAnimator(this.context).loadInto(this).apply {
|
fun ImageView.loadApng(url: URL, speed: Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) = ApngAnimator(this.context).loadInto(this).apply {
|
||||||
loadUrl(url, speed, apngAnimatorOptions)
|
loadUrl(url, speed, apngAnimatorOptions)
|
||||||
}
|
}
|
||||||
|
@ -57,6 +60,7 @@ fun ImageView.loadApng(url: URL, speed: Float? = null, apngAnimatorOptions: Apng
|
||||||
* @return [ApngAnimator] The animator
|
* @return [ApngAnimator] The animator
|
||||||
*/
|
*/
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
|
@JvmOverloads
|
||||||
fun ImageView.loadApng(byteArray: ByteArray, speed: Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) = ApngAnimator(this.context).loadInto(this).apply {
|
fun ImageView.loadApng(byteArray: ByteArray, speed: Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) = ApngAnimator(this.context).loadInto(this).apply {
|
||||||
load(byteArray, speed, apngAnimatorOptions)
|
load(byteArray, speed, apngAnimatorOptions)
|
||||||
}
|
}
|
||||||
|
@ -68,6 +72,7 @@ fun ImageView.loadApng(byteArray: ByteArray, speed: Float? = null, apngAnimatorO
|
||||||
* @return [ApngAnimator] The animator
|
* @return [ApngAnimator] The animator
|
||||||
*/
|
*/
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
|
@JvmOverloads
|
||||||
fun ImageView.loadApng(string: String, speed : Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) = ApngAnimator(this.context).loadInto(this).apply {
|
fun ImageView.loadApng(string: String, speed : Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) = ApngAnimator(this.context).loadInto(this).apply {
|
||||||
load(string, speed, apngAnimatorOptions)
|
load(string, speed, apngAnimatorOptions)
|
||||||
}
|
}
|
||||||
|
@ -79,6 +84,7 @@ fun ImageView.loadApng(string: String, speed : Float? = null, apngAnimatorOption
|
||||||
* @return [ApngAnimator] The animator
|
* @return [ApngAnimator] The animator
|
||||||
*/
|
*/
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
|
@JvmOverloads
|
||||||
fun ImageView.loadApng(@RawRes res : Int, speed : Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) = ApngAnimator(this.context).loadInto(this).apply {
|
fun ImageView.loadApng(@RawRes res : Int, speed : Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) = ApngAnimator(this.context).loadInto(this).apply {
|
||||||
load(res, speed, apngAnimatorOptions)
|
load(res, speed, apngAnimatorOptions)
|
||||||
}
|
}
|
||||||
|
@ -109,7 +115,7 @@ class ApngAnimator(private val context: Context?) {
|
||||||
private var activeAnimation: CustomAnimationDrawable? = null
|
private var activeAnimation: CustomAnimationDrawable? = null
|
||||||
|
|
||||||
private var doOnLoaded : (ApngAnimator) -> Unit = {}
|
private var doOnLoaded : (ApngAnimator) -> Unit = {}
|
||||||
private var animationLoopListener : () -> Unit = {}
|
private var frameChangeLister: (index : Int) -> Unit? = {}
|
||||||
|
|
||||||
private var duration : ArrayList<Float>? = null
|
private var duration : ArrayList<Float>? = null
|
||||||
|
|
||||||
|
@ -472,7 +478,7 @@ class ApngAnimator(private val context: Context?) {
|
||||||
}
|
}
|
||||||
activeAnimation = animResume
|
activeAnimation = animResume
|
||||||
imageView?.setImageDrawable(activeAnimation)
|
imageView?.setImageDrawable(activeAnimation)
|
||||||
activeAnimation?.setOnAnimationLoopListener(animationLoopListener)
|
activeAnimation?.setOnFrameChangeListener(frameChangeLister)
|
||||||
imageView?.invalidate()
|
imageView?.invalidate()
|
||||||
duration = dura
|
duration = dura
|
||||||
break@frameLoop
|
break@frameLoop
|
||||||
|
@ -493,12 +499,12 @@ class ApngAnimator(private val context: Context?) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set animation loop listener
|
* Set animation loop listener
|
||||||
* @param animationLoopListener The animation loop listener.
|
* @param frameChangeListener The listener.
|
||||||
*/
|
*/
|
||||||
fun setOnAnimationLoopListener(animationLoopListener : () -> Unit) {
|
fun setOnFrameChangeLister(frameChangeListener : (index : Int) -> Unit?) {
|
||||||
if (isApng) {
|
if (isApng) {
|
||||||
this.animationLoopListener = animationLoopListener
|
this.frameChangeLister = frameChangeListener
|
||||||
anim?.setOnAnimationLoopListener(animationLoopListener)
|
anim?.setOnFrameChangeListener(frameChangeListener)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,19 +7,15 @@ import android.graphics.drawable.AnimationDrawable
|
||||||
* for the caller to listen for specific animation related events.
|
* for the caller to listen for specific animation related events.
|
||||||
*/
|
*/
|
||||||
class CustomAnimationDrawable : AnimationDrawable() {
|
class CustomAnimationDrawable : AnimationDrawable() {
|
||||||
private var onAnimationLoop : () -> Unit = {}
|
private var onFrameChangeListener : (index : Int) -> Unit? = {}
|
||||||
|
|
||||||
fun setOnAnimationLoopListener( f : () -> Unit) {
|
fun setOnFrameChangeListener( f : (index : Int) -> Unit?) {
|
||||||
onAnimationLoop = f
|
onFrameChangeListener = f
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun selectDrawable(index: Int): Boolean {
|
override fun selectDrawable(index: Int): Boolean {
|
||||||
val drawableChanged = super.selectDrawable(index)
|
val drawableChanged = super.selectDrawable(index)
|
||||||
|
onFrameChangeListener(index)
|
||||||
if (index != 0 && index == numberOfFrames - 1) {
|
|
||||||
onAnimationLoop()
|
|
||||||
}
|
|
||||||
|
|
||||||
return drawableChanged
|
return drawableChanged
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,41 +1,45 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
package="oupson.apngcreator">
|
package="oupson.apngcreator">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:hardwareAccelerated="false"
|
android:hardwareAccelerated="false"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:largeHeap="true"
|
android:largeHeap="true"
|
||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/AppTheme">
|
android:theme="@style/AppTheme">
|
||||||
|
<activity android:name=".JavaActivity"
|
||||||
|
android:exported="true">
|
||||||
|
</activity>
|
||||||
<activity android:name=".MainActivity">
|
<activity android:name=".MainActivity">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:name=".Main2Activity"
|
android:name=".Main2Activity"
|
||||||
android:label="APNG Viewer">
|
android:label="APNG Viewer">
|
||||||
<intent-filter tools:ignore="AppLinkUrlError">
|
<intent-filter tools:ignore="AppLinkUrlError">
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
|
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
|
|
||||||
<data android:mimeType="image/png" />
|
<data android:mimeType="image/png"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity android:name=".CreatorActivity"
|
<activity
|
||||||
android:exported="true"/>
|
android:name=".CreatorActivity"
|
||||||
|
android:exported="true"/>
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
|
@ -0,0 +1,30 @@
|
||||||
|
package oupson.apngcreator;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import kotlin.Unit;
|
||||||
|
import oupson.apng.ApngAnimator;
|
||||||
|
import oupson.apng.ApngAnimatorKt;
|
||||||
|
public class JavaActivity extends AppCompatActivity {
|
||||||
|
static String TAG = "JavaActivity";
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_java);
|
||||||
|
String imageUrl = "https://metagif.files.wordpress.com/2015/01/bugbuckbunny.png";
|
||||||
|
ImageView image = findViewById(R.id.javaImageView);
|
||||||
|
ApngAnimator a = ApngAnimatorKt.loadApng(image, imageUrl);
|
||||||
|
a.onLoaded((animator) -> {
|
||||||
|
animator.setOnFrameChangeLister((index) -> {
|
||||||
|
if (index == 0) {
|
||||||
|
Log.i(TAG, "Loop");
|
||||||
|
}
|
||||||
|
return Unit.INSTANCE;
|
||||||
|
});
|
||||||
|
return Unit.INSTANCE;
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -52,6 +52,9 @@ class MainActivity : AppCompatActivity() {
|
||||||
startActivity<CreatorActivity>()
|
startActivity<CreatorActivity>()
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
R.id.action_open_java_activity -> {
|
||||||
|
startActivity<JavaActivity>()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.lparams {
|
}.lparams {
|
||||||
|
@ -115,7 +118,7 @@ class MainActivity : AppCompatActivity() {
|
||||||
id = View.generateViewId()
|
id = View.generateViewId()
|
||||||
animator = this.loadApng(imageUrl).apply {
|
animator = this.loadApng(imageUrl).apply {
|
||||||
onLoaded {
|
onLoaded {
|
||||||
setOnAnimationLoopListener {
|
setOnFrameChangeLister {
|
||||||
// Log.e("app-test", "onLoop")
|
// Log.e("app-test", "onLoop")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".JavaActivity">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="0dp" app:srcCompat="@mipmap/ic_launcher" android:id="@+id/javaImageView"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"/>
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -3,5 +3,8 @@
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
<item android:id="@+id/action_open_create_activity"
|
<item android:id="@+id/action_open_create_activity"
|
||||||
android:title="Create apng"
|
android:title="Create apng"
|
||||||
app:showAsAction="never"/>
|
app:showAsAction="never" />
|
||||||
|
<item android:id="@+id/action_open_java_activity"
|
||||||
|
android:title="Java Activity"
|
||||||
|
app:showAsAction="never" />
|
||||||
</menu>
|
</menu>
|
|
@ -10,7 +10,6 @@ buildscript {
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.4.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
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue