Convert sample app to Kotlin
This commit is contained in:
parent
7e573353d4
commit
8d25bc8a21
|
@ -9,7 +9,7 @@ allprojects {
|
|||
|
||||
buildscript {
|
||||
ext {
|
||||
kotlin_version = "1.9.10"
|
||||
kotlin_version = "1.9.20"
|
||||
}
|
||||
repositories {
|
||||
mavenCentral()
|
||||
|
|
|
@ -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
|
||||
|
|
3
gradle/wrapper/gradle-wrapper.properties
vendored
3
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -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
|
||||
|
|
|
@ -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
19
library/build.gradle.kts
Executable 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")
|
||||
}
|
|
@ -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
50
sample/build.gradle.kts
Executable 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")
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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"));
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
});
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
package com.davemorrissey.labs.subscaleview.test.imagedisplay;
|
||||