Convert sample app to Kotlin

This commit is contained in:
arkon 2023-11-17 17:15:00 -05:00
parent 7e573353d4
commit 8d25bc8a21
57 changed files with 1274 additions and 1495 deletions

View File

@ -9,7 +9,7 @@ allprojects {
buildscript {
ext {
kotlin_version = "1.9.10"
kotlin_version = "1.9.20"
}
repositories {
mavenCentral()

View File

@ -11,11 +11,8 @@
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# 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
# org.gradle.parallel=true
org.gradle.parallel=true
org.gradle.caching=true
# AndroidX support
#android.enableJetifier=true
android.useAndroidX=true

View File

@ -1,6 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@ -1,21 +0,0 @@
apply plugin: 'com.android.library'
android {
namespace "com.davemorrissey.labs.subscaleview"
compileSdk = 34
defaultConfig {
minSdkVersion 21
targetSdkVersion 34
versionCode = 1
versionName = "1.0"
consumerProguardFiles 'proguard-rules.txt'
}
}
dependencies {
implementation 'androidx.annotation:annotation:1.7.0'
implementation 'com.github.tachiyomiorg:image-decoder:fbd6601290'
}

19
library/build.gradle.kts Executable file
View File

@ -0,0 +1,19 @@
plugins {
id("com.android.library")
}
android {
namespace = "com.davemorrissey.labs.subscaleview"
compileSdk = 34
defaultConfig {
minSdk = 21
consumerProguardFiles("proguard-rules.txt")
}
}
dependencies {
implementation("androidx.annotation:annotation:1.7.0")
implementation("com.github.tachiyomiorg:image-decoder:fbd6601290")
}

View File

@ -1,35 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'org.jetbrains.kotlin.android'
android {
namespace "com.davemorrissey.labs.subscaleview.test"
compileSdk = 34
defaultConfig {
applicationId "com.davemorrissey.labs.subscaleview.test"
minSdkVersion 21
targetSdkVersion 34
versionCode 4
versionName "3.1.0"
defaultConfig {
packagingOptions {
doNotStrip '*/mips/*.so'
doNotStrip '*/mips64/*.so'
}
}
}
sourceSets {
main {
assets.srcDirs = ['assets']
}
}
}
dependencies {
implementation project(':library')
implementation 'androidx.appcompat:appcompat:1.7.0-alpha03'
implementation 'androidx.viewpager:viewpager:1.1.0-alpha01'
}

50
sample/build.gradle.kts Executable file
View File

@ -0,0 +1,50 @@
plugins {
id("com.android.application")
kotlin("android")
}
android {
namespace = "com.davemorrissey.labs.subscaleview.test"
compileSdk = 34
defaultConfig {
applicationId = "com.davemorrissey.labs.subscaleview.test"
minSdk = 21
targetSdk = 34
versionCode = 4
versionName = "3.1.0"
defaultConfig {
packagingOptions {
jniLibs.keepDebugSymbols.addAll(listOf("*/mips/*.so", "*/mips64/*.so"))
}
}
compileOptions {
viewBinding.isEnabled = true
}
}
sourceSets {
getByName("main").assets.srcDirs("assets")
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
}
dependencies {
implementation(project(":library"))
implementation("androidx.appcompat:appcompat:1.7.0-alpha03")
implementation("androidx.viewpager:viewpager:1.1.0-alpha01")
}

View File

@ -1,80 +0,0 @@
package com.davemorrissey.labs.subscaleview.test;
import android.app.ActionBar;
import android.os.Bundle;
import android.view.MenuItem;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
import java.util.List;
public abstract class AbstractFragmentsActivity extends FragmentActivity {
private static final String BUNDLE_PAGE = "page";
private final int title;
private final int layout;
private final List<Page> notes;
private int page;
protected AbstractFragmentsActivity(int title, int layout, List<Page> notes) {
this.title = title;
this.layout = layout;
this.notes = notes;
}
protected abstract void onPageChanged(int page);
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout);
ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setTitle(getString(title));
actionBar.setDisplayHomeAsUpEnabled(true);
}
if (savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_PAGE)) {
page = savedInstanceState.getInt(BUNDLE_PAGE);
}
}
@Override
protected void onResume() {
super.onResume();
updateNotes();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(BUNDLE_PAGE, page);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
finish();
return true;
}
public void next() {
page++;
updateNotes();
}
public void previous() {
page--;
updateNotes();
}
private void updateNotes() {
if (page > notes.size() - 1) {
return;
}
ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setSubtitle(notes.get(page).getSubtitle());
}
onPageChanged(page);
}
}

View File

@ -1,92 +0,0 @@
package com.davemorrissey.labs.subscaleview.test;
import android.app.ActionBar;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
import java.util.List;
public abstract class AbstractPagesActivity extends FragmentActivity {
private static final String BUNDLE_PAGE = "page";
private final int title;
private final int layout;
private final List<Page> notes;
private int page;
protected AbstractPagesActivity(int title, int layout, List<Page> notes) {
this.title = title;
this.layout = layout;
this.notes = notes;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout);
ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setTitle(getString(title));
actionBar.setDisplayHomeAsUpEnabled(true);
}
findViewById(R.id.next).setOnClickListener(v -> next());
findViewById(R.id.previous).setOnClickListener(v -> previous());
if (savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_PAGE)) {
page = savedInstanceState.getInt(BUNDLE_PAGE);
}
}
@Override
protected void onResume() {
super.onResume();
updateNotes();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(BUNDLE_PAGE, page);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
finish();
return true;
}
private void next() {
page++;
updateNotes();
}
private void previous() {
page--;
updateNotes();
}
private void updateNotes() {
if (page > notes.size() - 1) {
return;
}
ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setSubtitle(notes.get(page).getSubtitle());
}
((TextView) findViewById(R.id.note)).setText(notes.get(page).getText());
findViewById(R.id.next).setVisibility(page >= notes.size() - 1 ? View.INVISIBLE : View.VISIBLE);
findViewById(R.id.previous).setVisibility(page <= 0 ? View.INVISIBLE : View.VISIBLE);
onPageChanged(page);
}
protected final int getPage() {
return page;
}
protected void onPageChanged(int page) {
}
}

View File

@ -1,89 +0,0 @@
package com.davemorrissey.labs.subscaleview.test;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import com.davemorrissey.labs.subscaleview.test.R.id;
import com.davemorrissey.labs.subscaleview.test.animation.AnimationActivity;
import com.davemorrissey.labs.subscaleview.test.basicfeatures.BasicFeaturesActivity;
import com.davemorrissey.labs.subscaleview.test.configuration.ConfigurationActivity;
import com.davemorrissey.labs.subscaleview.test.eventhandling.EventHandlingActivity;
import com.davemorrissey.labs.subscaleview.test.eventhandlingadvanced.AdvancedEventHandlingActivity;
import com.davemorrissey.labs.subscaleview.test.extension.ExtensionActivity;
import com.davemorrissey.labs.subscaleview.test.imagedisplay.ImageDisplayActivity;
import com.davemorrissey.labs.subscaleview.test.viewpager.ViewPagerActivity;
public class MainActivity extends Activity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setTitle(R.string.main_title);
}
setContentView(R.layout.main);
findViewById(id.basicFeatures).setOnClickListener(this);
findViewById(id.imageDisplay).setOnClickListener(this);
findViewById(id.eventHandling).setOnClickListener(this);
findViewById(id.advancedEventHandling).setOnClickListener(this);
findViewById(id.viewPagerGalleries).setOnClickListener(this);
findViewById(id.animation).setOnClickListener(this);
findViewById(id.extension).setOnClickListener(this);
findViewById(id.configuration).setOnClickListener(this);
findViewById(id.github).setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case id.basicFeatures:
startActivity(BasicFeaturesActivity.class);
break;
case id.imageDisplay:
startActivity(ImageDisplayActivity.class);
break;
case id.eventHandling:
startActivity(EventHandlingActivity.class);
break;
case id.advancedEventHandling:
startActivity(AdvancedEventHandlingActivity.class);
break;
case id.viewPagerGalleries:
startActivity(ViewPagerActivity.class);
break;
case id.animation:
startActivity(AnimationActivity.class);
break;
case id.extension:
startActivity(ExtensionActivity.class);
break;
case id.configuration:
startActivity(ConfigurationActivity.class);
break;
case id.github:
openGitHub();
break;
}
}
private void startActivity(Class<? extends Activity> activity) {
Intent intent = new Intent(this, activity);
startActivity(intent);
}
private void openGitHub() {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("https://github.com/davemorrissey/subsampling-scale-image-view"));
startActivity(i);
}
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
}

View File

@ -1,21 +0,0 @@
package com.davemorrissey.labs.subscaleview.test;
public class Page {
private final int text;
private final int subtitle;
public Page(int subtitle, int text) {
this.subtitle = subtitle;
this.text = text;
}
public int getText() {
return text;
}
public int getSubtitle() {
return subtitle;
}
}

View File

@ -1,78 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.animation;
import static com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView.EASE_OUT_QUAD;
import static com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView.PAN_LIMIT_CENTER;
import static com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView.PAN_LIMIT_INSIDE;
import static com.davemorrissey.labs.subscaleview.test.R.layout.animation_activity;
import static com.davemorrissey.labs.subscaleview.test.R.string.animation_p1_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.animation_p1_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.animation_p2_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.animation_p2_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.animation_p3_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.animation_p3_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.animation_p4_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.animation_p4_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.animation_title;
import android.graphics.PointF;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView.AnimationBuilder;
import com.davemorrissey.labs.subscaleview.test.AbstractPagesActivity;
import com.davemorrissey.labs.subscaleview.test.Page;
import com.davemorrissey.labs.subscaleview.test.R.id;
import com.davemorrissey.labs.subscaleview.test.extension.views.PinView;
import java.util.Arrays;
import java.util.Random;
public class AnimationActivity extends AbstractPagesActivity {
private PinView view;
public AnimationActivity() {
super(animation_title, animation_activity, Arrays.asList(
new Page(animation_p1_subtitle, animation_p1_text),
new Page(animation_p2_subtitle, animation_p2_text),
new Page(animation_p3_subtitle, animation_p3_text),
new Page(animation_p4_subtitle, animation_p4_text)
));
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
findViewById(id.play).setOnClickListener(v -> AnimationActivity.this.play());
view = findViewById(id.imageView);
view.setImage(ImageSource.asset(this, "sanmartino.jpg"));
}
@Override
protected void onPageChanged(int page) {
if (page == 2) {
view.setPanLimit(PAN_LIMIT_CENTER);
} else {
view.setPanLimit(PAN_LIMIT_INSIDE);
}
}
private void play() {
Random random = new Random();
if (view.isReady()) {
float maxScale = view.getMaxScale();
float minScale = view.getMinScale();
float scale = (random.nextFloat() * (maxScale - minScale)) + minScale;
PointF center = new PointF(random.nextInt(view.getSWidth()), random.nextInt(view.getSHeight()));
view.setPin(center);
AnimationBuilder animationBuilder = view.animateScaleAndCenter(scale, center);
if (getPage() == 3) {
animationBuilder.withDuration(2000).withEasing(EASE_OUT_QUAD).withInterruptible(false).start();
} else {
animationBuilder.withDuration(750).start();
}
}
}
}

View File

@ -1,46 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.basicfeatures;
import static com.davemorrissey.labs.subscaleview.test.R.layout.pages_activity;
import static com.davemorrissey.labs.subscaleview.test.R.string.basic_p1_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.basic_p1_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.basic_p2_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.basic_p2_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.basic_p3_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.basic_p3_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.basic_p4_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.basic_p4_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.basic_p5_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.basic_p5_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.basic_title;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import com.davemorrissey.labs.subscaleview.test.AbstractPagesActivity;
import com.davemorrissey.labs.subscaleview.test.Page;
import com.davemorrissey.labs.subscaleview.test.R.id;
import java.util.Arrays;
public class BasicFeaturesActivity extends AbstractPagesActivity {
public BasicFeaturesActivity() {
super(basic_title, pages_activity, Arrays.asList(
new Page(basic_p1_subtitle, basic_p1_text),
new Page(basic_p2_subtitle, basic_p2_text),
new Page(basic_p3_subtitle, basic_p3_text),
new Page(basic_p4_subtitle, basic_p4_text),
new Page(basic_p5_subtitle, basic_p5_text)
));
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SubsamplingScaleImageView view = findViewById(id.imageView);
view.setImage(ImageSource.asset(this, "sanmartino.jpg"));
}
}

View File

@ -1,114 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.configuration;
import static com.davemorrissey.labs.subscaleview.test.R.layout.pages_activity;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p10_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p10_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p1_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p1_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p2_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p2_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p3_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p3_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p4_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p4_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p5_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p5_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p6_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p6_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p7_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p7_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p8_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p8_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p9_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_p9_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.configuration_title;
import android.graphics.PointF;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import com.davemorrissey.labs.subscaleview.test.AbstractPagesActivity;
import com.davemorrissey.labs.subscaleview.test.Page;
import com.davemorrissey.labs.subscaleview.test.R.id;
import java.util.Arrays;
public class ConfigurationActivity extends AbstractPagesActivity {
private SubsamplingScaleImageView view;
public ConfigurationActivity() {
super(configuration_title, pages_activity, Arrays.asList(
new Page(configuration_p1_subtitle, configuration_p1_text),
new Page(configuration_p2_subtitle, configuration_p2_text),
new Page(configuration_p3_subtitle, configuration_p3_text),
new Page(configuration_p4_subtitle, configuration_p4_text),
new Page(configuration_p5_subtitle, configuration_p5_text),
new Page(configuration_p6_subtitle, configuration_p6_text),
new Page(configuration_p7_subtitle, configuration_p7_text),
new Page(configuration_p8_subtitle, configuration_p8_text),
new Page(configuration_p9_subtitle, configuration_p9_text),
new Page(configuration_p10_subtitle, configuration_p10_text)
));
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = findViewById(id.imageView);
view.setImage(ImageSource.asset(this, "card.png"));
}
@Override
protected void onPageChanged(int page) {
if (page == 0) {
view.setMinimumDpi(50);
} else {
view.setMaxScale(2F);
}
if (page == 1) {
view.setMinimumTileDpi(50);
} else {
view.setMinimumTileDpi(320);
}
if (page == 4) {
view.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER);
} else if (page == 5) {
view.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER_IMMEDIATE);
} else {
view.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_FIXED);
}
if (page == 6) {
view.setDoubleTapZoomDpi(240);
} else {
view.setDoubleTapZoomScale(1F);
}
if (page == 7) {
view.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_CENTER);
} else if (page == 8) {
view.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_OUTSIDE);
} else {
view.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_INSIDE);
}
if (page == 9) {
view.setDebug(true);
} else {
view.setDebug(false);
}
if (page == 2) {
view.setScaleAndCenter(0f, new PointF(3900, 3120));
view.setPanEnabled(false);
} else {
view.setPanEnabled(true);
}
if (page == 3) {
view.setScaleAndCenter(1f, new PointF(3900, 3120));
view.setZoomEnabled(false);
} else {
view.setZoomEnabled(true);
}
}
}

View File

@ -1,44 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.eventhandling;
import static com.davemorrissey.labs.subscaleview.test.R.layout.pages_activity;
import static com.davemorrissey.labs.subscaleview.test.R.string.event_p1_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.event_p1_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.event_p2_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.event_p2_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.event_p3_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.event_p3_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.event_title;
import android.os.Bundle;
import android.widget.Toast;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import com.davemorrissey.labs.subscaleview.test.AbstractPagesActivity;
import com.davemorrissey.labs.subscaleview.test.Page;
import com.davemorrissey.labs.subscaleview.test.R.id;
import java.util.Arrays;
public class EventHandlingActivity extends AbstractPagesActivity {
public EventHandlingActivity() {
super(event_title, pages_activity, Arrays.asList(
new Page(event_p1_subtitle, event_p1_text),
new Page(event_p2_subtitle, event_p2_text),
new Page(event_p3_subtitle, event_p3_text)
));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SubsamplingScaleImageView imageView = findViewById(id.imageView);
imageView.setImage(ImageSource.asset(this, "sanmartino.jpg"));
imageView.setOnClickListener(v -> Toast.makeText(v.getContext(), "Clicked", Toast.LENGTH_SHORT).show());
imageView.setOnLongClickListener(v -> {
Toast.makeText(v.getContext(), "Long clicked", Toast.LENGTH_SHORT).show();
return true;
});
}
}

View File

@ -1,83 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.eventhandlingadvanced;
import static com.davemorrissey.labs.subscaleview.test.R.layout.pages_activity;
import static com.davemorrissey.labs.subscaleview.test.R.string.advancedevent_p1_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.advancedevent_p1_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.advancedevent_p2_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.advancedevent_p2_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.advancedevent_p3_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.advancedevent_p3_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.advancedevent_p4_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.advancedevent_p4_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.advancedevent_p5_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.advancedevent_p5_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.advancedevent_title;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.Toast;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import com.davemorrissey.labs.subscaleview.test.AbstractPagesActivity;
import com.davemorrissey.labs.subscaleview.test.Page;
import com.davemorrissey.labs.subscaleview.test.R.id;
import java.util.Arrays;
public class AdvancedEventHandlingActivity extends AbstractPagesActivity {
public AdvancedEventHandlingActivity() {
super(advancedevent_title, pages_activity, Arrays.asList(
new Page(advancedevent_p1_subtitle, advancedevent_p1_text),
new Page(advancedevent_p2_subtitle, advancedevent_p2_text),
new Page(advancedevent_p3_subtitle, advancedevent_p3_text),
new Page(advancedevent_p4_subtitle, advancedevent_p4_text),
new Page(advancedevent_p5_subtitle, advancedevent_p5_text)
));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final SubsamplingScaleImageView imageView = findViewById(id.imageView);
final GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
if (imageView.isReady()) {
PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY());
Toast.makeText(getApplicationContext(), "Single tap: " + ((int) sCoord.x) + ", " + ((int) sCoord.y), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "Single tap: Image not ready", Toast.LENGTH_SHORT).show();
}
return true;
}
@Override
public void onLongPress(MotionEvent e) {
if (imageView.isReady()) {
PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY());
Toast.makeText(getApplicationContext(), "Long press: " + ((int) sCoord.x) + ", " + ((int) sCoord.y), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "Long press: Image not ready", Toast.LENGTH_SHORT).show();
}
}
@Override
public boolean onDoubleTap(MotionEvent e) {
if (imageView.isReady()) {
PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY());
Toast.makeText(getApplicationContext(), "Double tap: " + ((int) sCoord.x) + ", " + ((int) sCoord.y), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "Double tap: Image not ready", Toast.LENGTH_SHORT).show();
}
return true;
}
});
imageView.setImage(ImageSource.asset(this, "sanmartino.jpg"));
imageView.setOnTouchListener((view, motionEvent) -> gestureDetector.onTouchEvent(motionEvent));
}
}

View File

@ -1,52 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.extension;
import static com.davemorrissey.labs.subscaleview.test.R.layout.fragments_activity;
import static com.davemorrissey.labs.subscaleview.test.R.string.extension_p1_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.extension_p1_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.extension_p2_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.extension_p2_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.extension_p3_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.extension_p3_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.extension_title;
import android.util.Log;
import androidx.fragment.app.Fragment;
import com.davemorrissey.labs.subscaleview.test.AbstractFragmentsActivity;
import com.davemorrissey.labs.subscaleview.test.Page;
import com.davemorrissey.labs.subscaleview.test.R.id;
import com.davemorrissey.labs.subscaleview.test.imagedisplay.ImageDisplayActivity;
import java.util.Arrays;
import java.util.List;
public class ExtensionActivity extends AbstractFragmentsActivity {
private static final List<Class<? extends Fragment>> FRAGMENTS = Arrays.asList(
ExtensionPinFragment.class,
ExtensionCircleFragment.class,
ExtensionFreehandFragment.class
);
public ExtensionActivity() {
super(extension_title, fragments_activity, Arrays.asList(
new Page(extension_p1_subtitle, extension_p1_text),
new Page(extension_p2_subtitle, extension_p2_text),
new Page(extension_p3_subtitle, extension_p3_text)
));
}
@Override
protected void onPageChanged(int page) {
try {
getSupportFragmentManager()
.beginTransaction()
.replace(id.frame, FRAGMENTS.get(page).newInstance())
.commit();
} catch (Exception e) {
Log.e(ImageDisplayActivity.class.getName(), "Failed to load fragment", e);
}
}
}

View File

@ -1,41 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.extension;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import com.davemorrissey.labs.subscaleview.test.R.id;
import com.davemorrissey.labs.subscaleview.test.R.layout;
public class ExtensionCircleFragment extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(layout.extension_circle_fragment, container, false);
final ExtensionActivity activity = (ExtensionActivity) getActivity();
if (activity != null) {
rootView.findViewById(id.next).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
activity.next();
}
});
rootView.findViewById(id.previous).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
activity.previous();
}
});
}
SubsamplingScaleImageView imageView = rootView.findViewById(id.imageView);
imageView.setImage(ImageSource.asset(getContext(), "sanmartino.jpg"));
return rootView;
}
}

View File

@ -1,41 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.extension;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.test.R.id;
import com.davemorrissey.labs.subscaleview.test.R.layout;
import com.davemorrissey.labs.subscaleview.test.extension.views.FreehandView;
public class ExtensionFreehandFragment extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(layout.extension_freehand_fragment, container, false);
final ExtensionActivity activity = (ExtensionActivity) getActivity();
if (activity != null) {
rootView.findViewById(id.previous).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
activity.previous();
}
});
}
final FreehandView imageView = rootView.findViewById(id.imageView);
imageView.setImage(ImageSource.asset(getContext(), "sanmartino.jpg"));
rootView.findViewById(id.reset).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
imageView.reset();
}
});
return rootView;
}
}

View File

@ -1,37 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.extension;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.test.R.id;
import com.davemorrissey.labs.subscaleview.test.R.layout;
import com.davemorrissey.labs.subscaleview.test.extension.views.PinView;
public class ExtensionPinFragment extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(layout.extension_pin_fragment, container, false);
final ExtensionActivity activity = (ExtensionActivity) getActivity();
if (activity != null) {
rootView.findViewById(id.next).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
activity.next();
}
});
}
PinView imageView = rootView.findViewById(id.imageView);
imageView.setImage(ImageSource.asset(getContext(), "sanmartino.jpg"));
imageView.setPin(new PointF(1602f, 405f));
return rootView;
}
}

View File

@ -1,58 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.extension.views;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Cap;
import android.graphics.Paint.Style;
import android.graphics.PointF;
import android.util.AttributeSet;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
public class CircleView extends SubsamplingScaleImageView {
private final PointF sCenter = new PointF();
private final PointF vCenter = new PointF();
private final Paint paint = new Paint();
private int strokeWidth;
public CircleView(Context context) {
this(context, null);
}
public CircleView(Context context, AttributeSet attr) {
super(context, attr);
initialise();
}
private void initialise() {
float density = getResources().getDisplayMetrics().densityDpi;
strokeWidth = (int) (density / 60f);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// Don't draw pin before image is ready so it doesn't move around during setup.
if (!isReady()) {
return;
}
sCenter.set(getSWidth() / 2, getSHeight() / 2);
sourceToViewCoord(sCenter, vCenter);
float radius = (getScale() * getSWidth()) * 0.25f;
paint.setAntiAlias(true);
paint.setStyle(Style.STROKE);
paint.setStrokeCap(Cap.ROUND);
paint.setStrokeWidth(strokeWidth * 2);
paint.setColor(Color.BLACK);
canvas.drawCircle(vCenter.x, vCenter.y, radius, paint);
paint.setStrokeWidth(strokeWidth);
paint.setColor(Color.argb(255, 51, 181, 229));
canvas.drawCircle(vCenter.x, vCenter.y, radius, paint);
}
}

View File

@ -1,146 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.extension.views;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Cap;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import androidx.annotation.NonNull;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import java.util.ArrayList;
import java.util.List;
public class FreehandView extends SubsamplingScaleImageView implements OnTouchListener {
private final Paint paint = new Paint();
private final Path vPath = new Path();
private final PointF vPoint = new PointF();
private PointF vPrev = new PointF();
private PointF vPrevious;
private PointF vStart;
private boolean drawing = false;
private int strokeWidth;
private List<PointF> sPoints;
public FreehandView(Context context, AttributeSet attr) {
super(context, attr);
initialise();
}
public FreehandView(Context context) {
this(context, null);
}
private void initialise() {
setOnTouchListener(this);
float density = getResources().getDisplayMetrics().densityDpi;
strokeWidth = (int) (density / 60f);
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
@Override
public boolean onTouchEvent(@NonNull MotionEvent event) {
if (sPoints != null && !drawing) {
return super.onTouchEvent(event);
}
boolean consumed = false;
int touchCount = event.getPointerCount();
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
if (event.getActionIndex() == 0) {
vStart = new PointF(event.getX(), event.getY());
vPrevious = new PointF(event.getX(), event.getY());
} else {
vStart = null;
vPrevious = null;
}
break;
case MotionEvent.ACTION_MOVE:
PointF sCurrentF = viewToSourceCoord(event.getX(), event.getY());
PointF sCurrent = new PointF(sCurrentF.x, sCurrentF.y);
PointF sStart = vStart == null ? null : new PointF(viewToSourceCoord(vStart).x, viewToSourceCoord(vStart).y);
if (touchCount == 1 && vStart != null) {
float vDX = Math.abs(event.getX() - vPrevious.x);
float vDY = Math.abs(event.getY() - vPrevious.y);
if (vDX >= strokeWidth * 5 || vDY >= strokeWidth * 5) {
if (sPoints == null) {
sPoints = new ArrayList<>();
sPoints.add(sStart);
}
sPoints.add(sCurrent);
vPrevious.x = event.getX();
vPrevious.y = event.getY();
drawing = true;
}
consumed = true;
invalidate();
} else if (touchCount == 1) {
// Consume all one touch drags to prevent odd panning effects handled by the superclass.
consumed = true;
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
invalidate();
drawing = false;
vPrevious = null;
vStart = null;
}
// Use parent to handle pinch and two-finger pan.
return consumed || super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// Don't draw anything before image is ready.
if (!isReady()) {
return;
}
paint.setAntiAlias(true);
if (sPoints != null && sPoints.size() >= 2) {
vPath.reset();
sourceToViewCoord(sPoints.get(0).x, sPoints.get(0).y, vPrev);
vPath.moveTo(vPrev.x, vPrev.y);
for (int i = 1; i < sPoints.size(); i++) {
sourceToViewCoord(sPoints.get(i).x, sPoints.get(i).y, vPoint);
vPath.quadTo(vPrev.x, vPrev.y, (vPoint.x + vPrev.x) / 2, (vPoint.y + vPrev.y) / 2);
vPrev = vPoint;
}
paint.setStyle(Style.STROKE);
paint.setStrokeCap(Cap.ROUND);
paint.setStrokeWidth(strokeWidth * 2);
paint.setColor(Color.BLACK);
canvas.drawPath(vPath, paint);
paint.setStrokeWidth(strokeWidth);
paint.setColor(Color.argb(255, 51, 181, 229));
canvas.drawPath(vPath, paint);
}
}
public void reset() {
this.sPoints = null;
invalidate();
}
}

View File

@ -1,63 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.extension.views;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PointF;
import android.util.AttributeSet;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import com.davemorrissey.labs.subscaleview.test.R.drawable;
public class PinView extends SubsamplingScaleImageView {
private final Paint paint = new Paint();
private final PointF vPin = new PointF();
private PointF sPin;
private Bitmap pin;
public PinView(Context context) {
this(context, null);
}
public PinView(Context context, AttributeSet attr) {
super(context, attr);
initialise();
}
public void setPin(PointF sPin) {
this.sPin = sPin;
initialise();
invalidate();
}
private void initialise() {
float density = getResources().getDisplayMetrics().densityDpi;
pin = BitmapFactory.decodeResource(this.getResources(), drawable.pushpin_blue);
float w = (density / 420f) * pin.getWidth();
float h = (density / 420f) * pin.getHeight();
pin = Bitmap.createScaledBitmap(pin, (int) w, (int) h, true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// Don't draw pin before image is ready so it doesn't move around during setup.
if (!isReady()) {
return;
}
paint.setAntiAlias(true);
if (sPin != null && pin != null) {
sourceToViewCoord(sPin, vPin);
float vX = vPin.x - (pin.getWidth() / 2);
float vY = vPin.y - pin.getHeight();
canvas.drawBitmap(pin, vX, vY, paint);
}
}
}

View File

@ -1,50 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.imagedisplay;
import static com.davemorrissey.labs.subscaleview.test.R.layout.fragments_activity;
import static com.davemorrissey.labs.subscaleview.test.R.string.display_p1_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.display_p1_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.display_p2_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.display_p2_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.display_p3_subtitle;
import static com.davemorrissey.labs.subscaleview.test.R.string.display_p3_text;
import static com.davemorrissey.labs.subscaleview.test.R.string.display_title;
import android.util.Log;
import androidx.fragment.app.Fragment;
import com.davemorrissey.labs.subscaleview.test.AbstractFragmentsActivity;
import com.davemorrissey.labs.subscaleview.test.Page;
import com.davemorrissey.labs.subscaleview.test.R.id;
import java.util.Arrays;
import java.util.List;
public class ImageDisplayActivity extends AbstractFragmentsActivity {
private static final List<Class<? extends Fragment>> FRAGMENTS = Arrays.asList(
ImageDisplayLargeFragment.class,
ImageDisplayRotateFragment.class,
ImageDisplayRegionFragment.class
);
public ImageDisplayActivity() {
super(display_title, fragments_activity, Arrays.asList(
new Page(display_p1_subtitle, display_p1_text),
new Page(display_p2_subtitle, display_p2_text),
new Page(display_p3_subtitle, display_p3_text)
));
}
@Override
protected void onPageChanged(int page) {
try {
getSupportFragmentManager()
.beginTransaction()
.replace(id.frame, FRAGMENTS.get(page).newInstance())
.commit();
} catch (Exception e) {
Log.e(ImageDisplayActivity.class.getName(), "Failed to load fragment", e);
}
}
}

View File

@ -1,29 +0,0 @@
package com.davemorrissey.labs.subscaleview.test.imagedisplay;