aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Morrissey <davemorrissey@gmail.com>2017-11-02 18:27:22 +0000
committerDavid Morrissey <davemorrissey@gmail.com>2017-11-02 18:27:22 +0000
commitc930ef77f57c0619c10893696452b94e75e0dd23 (patch)
tree61718f5f2fe37adeb4b19c6ce7c5bc45bcb933a3
parent83ad2285682f65eda8cb2884b29f13f6cc707bb6 (diff)
downloadsubsampling-scale-image-view-c930ef77f57c0619c10893696452b94e75e0dd23.tar.gz
Updated to build tools 3.0.0. Refactor of sample app to reduce duplicated code and styling.
-rw-r--r--build.gradle3
-rw-r--r--gradle/wrapper/gradle-wrapper.properties2
-rw-r--r--library/build.gradle10
-rw-r--r--sample/AndroidManifest.xml4
-rwxr-xr-xsample/assets/eagle.jpgbin0 -> 2472729 bytes
-rw-r--r--sample/assets/ness.jpgbin505307 -> 0 bytes
-rwxr-xr-xsample/assets/pony.jpgbin0 -> 1705468 bytes
-rw-r--r--sample/build.gradle15
-rw-r--r--sample/project.properties15
-rw-r--r--sample/res/layout/animation_activity.xml74
-rw-r--r--sample/res/layout/extension_activity.xml10
-rw-r--r--sample/res/layout/extension_circle_fragment.xml60
-rw-r--r--sample/res/layout/extension_freehand_fragment.xml76
-rw-r--r--sample/res/layout/extension_pin_fragment.xml61
-rw-r--r--sample/res/layout/fragments_activity.xml5
-rw-r--r--sample/res/layout/imagedisplay_large_fragment.xml61
-rw-r--r--sample/res/layout/imagedisplay_region_fragment.xml80
-rw-r--r--sample/res/layout/imagedisplay_rotate_fragment.xml75
-rw-r--r--sample/res/layout/main.xml152
-rw-r--r--sample/res/layout/notes_activity.xml59
-rw-r--r--sample/res/layout/pages_activity.xml18
-rw-r--r--sample/res/layout/view_pager.xml68
-rw-r--r--sample/res/layout/view_pager_page.xml9
-rw-r--r--sample/res/values/strings.xml184
-rw-r--r--sample/res/values/style.xml71
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/AbstractFragmentsActivity.java98
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/AbstractPagesActivity.java115
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/MainActivity.java72
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/Page.java37
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/animation/AnimationActivity.java133
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/basicfeatures/BasicFeaturesActivity.java97
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/configuration/ConfigurationActivity.java172
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/eventhandling/EventHandlingActivity.java108
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/eventhandlingadvanced/AdvancedEventHandlingActivity.java93
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionActivity.java97
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionCircleFragment.java17
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionFreehandFragment.java17
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionPinFragment.java11
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/CircleView.java9
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/FreehandView.java30
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/PinView.java9
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayActivity.java84
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayLargeFragment.java10
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayRegionFragment.java18
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayRotateFragment.java29
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/decoders/RapidImageDecoder.java26
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/decoders/RapidImageRegionDecoder.java53
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/viewpager/ViewPagerActivity.java111
-rw-r--r--sample/src/com/davemorrissey/labs/subscaleview/sample/viewpager/ViewPagerFragment.java2
49 files changed, 981 insertions, 1579 deletions
diff --git a/build.gradle b/build.gradle
index 9b7a19c..6db2e7b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,8 +3,9 @@ buildscript {
repositories {
mavenCentral()
jcenter()
+ google()
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.3.3'
+ classpath 'com.android.tools.build:gradle:3.0.0'
}
}
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 04a221d..92165ee 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.3-bin.zip
diff --git a/library/build.gradle b/library/build.gradle
index 486f387..636e34b 100644
--- a/library/build.gradle
+++ b/library/build.gradle
@@ -5,8 +5,7 @@ archivesBaseName = 'subsampling-scale-image-view'
version = '3.7.2'
android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
+ compileSdkVersion 26
defaultConfig {
consumerProguardFiles 'proguard-rules.txt'
@@ -38,8 +37,11 @@ android {
}
dependencies {
- compile fileTree(dir: 'libs', include: '*.jar')
- compile 'com.android.support:support-annotations:25.3.1'
+ implementation 'com.android.support:support-annotations:27.0.0'
}
apply from: rootProject.file('release.gradle')
+
+repositories {
+ google()
+} \ No newline at end of file
diff --git a/sample/AndroidManifest.xml b/sample/AndroidManifest.xml
index f35358d..db9d4e6 100644
--- a/sample/AndroidManifest.xml
+++ b/sample/AndroidManifest.xml
@@ -5,11 +5,11 @@
android:versionCode="4"
android:versionName="3.1.0"
android:hardwareAccelerated="true">
-<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="23"/>
+<uses-sdk android:minSdkVersion="17" android:targetSdkVersion="26"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove"/>
-<application android:label="Scale Image View Demo" android:theme="@style/demoTheme" android:icon="@drawable/launcher">
+<application android:label="@string/app.name" android:theme="@style/sampleTheme" android:icon="@drawable/launcher" android:allowBackup="false">
<activity android:name=".MainActivity" android:label="Scale View Demo">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
diff --git a/sample/assets/eagle.jpg b/sample/assets/eagle.jpg
new file mode 100755
index 0000000..c8a80b4
--- /dev/null
+++ b/sample/assets/eagle.jpg
Binary files differ
diff --git a/sample/assets/ness.jpg b/sample/assets/ness.jpg
deleted file mode 100644
index 213529a..0000000
--- a/sample/assets/ness.jpg
+++ /dev/null
Binary files differ
diff --git a/sample/assets/pony.jpg b/sample/assets/pony.jpg
new file mode 100755
index 0000000..cc11873
--- /dev/null
+++ b/sample/assets/pony.jpg
Binary files differ
diff --git a/sample/build.gradle b/sample/build.gradle
index 78c374c..6dccc7b 100644
--- a/sample/build.gradle
+++ b/sample/build.gradle
@@ -2,15 +2,12 @@ apply plugin: 'com.android.application'
allprojects {
repositories {
- maven {
- url 'https://github.com/suckgamony/RapidDecoder/raw/master/repository'
- }
+ google()
}
}
android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
+ compileSdkVersion 26
sourceSets {
main {
@@ -38,10 +35,6 @@ android {
}
dependencies {
- compile fileTree(dir: 'libs', include: '*.jar')
- compile project(':library')
- compile 'com.android.support:support-v4:25.3.1'
- compile 'rapid.decoder:library:0.3.0'
- compile 'rapid.decoder:jpeg-decoder:0.3.0'
- compile 'rapid.decoder:png-decoder:0.3.0'
+ implementation project(':library')
+ implementation 'com.android.support:support-v4:26.1.0'
}
diff --git a/sample/project.properties b/sample/project.properties
deleted file mode 100644
index a6cf15d..0000000
--- a/sample/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-19
-android.library.reference.1=../library
diff --git a/sample/res/layout/animation_activity.xml b/sample/res/layout/animation_activity.xml
index 2f61c2a..5416a88 100644
--- a/sample/res/layout/animation_activity.xml
+++ b/sample/res/layout/animation_activity.xml
@@ -1,72 +1,24 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/content"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/fill">
- <RelativeLayout
- android:id="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:background="#333">
- <ImageView
- android:id="@+id/previous"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:visibility="invisible"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/previous"/>
+ <RelativeLayout style="@style/footer" android:id="@+id/footer">
- <ImageView
- android:id="@+id/next"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/next"/>
+ <ImageView style="@style/previousButton" android:id="@+id/previous" android:contentDescription="@string/button.previous"/>
- <ImageView
+ <ImageView style="@style/nextButton" android:id="@+id/next" android:contentDescription="@string/button.next"/>
+
+ <ImageView style="@style/footerButton"
android:id="@+id/play"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toLeftOf="@id/next"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/play"/>
+ android:layout_toStartOf="@id/next"
+ android:src="@drawable/play"
+ android:contentDescription="@string/button.animate"/>
- <TextView
+ <TextView style="@style/footerNote"
android:id="@+id/note"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_toLeftOf="@id/play"
- android:layout_toRightOf="@id/previous"
- android:layout_centerVertical="true"
- android:padding="10dp"
- android:textSize="14sp"
- android:textColor="#FFFFFF"/>
+ android:layout_toStartOf="@id/play"
+ android:layout_toEndOf="@id/previous"/>
</RelativeLayout>
- <com.davemorrissey.labs.subscaleview.sample.extension.views.PinView
- android:id="@+id/imageView"
- android:layout_alignParentTop="true"
- android:layout_above="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
+ <com.davemorrissey.labs.subscaleview.sample.extension.views.PinView style="@style/mainPanel" android:id="@+id/imageView"/>
</RelativeLayout>
diff --git a/sample/res/layout/extension_activity.xml b/sample/res/layout/extension_activity.xml
deleted file mode 100644
index 0f4d200..0000000
--- a/sample/res/layout/extension_activity.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/content"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
-
- <FrameLayout android:id="@+id/frame"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
-
-</RelativeLayout>
diff --git a/sample/res/layout/extension_circle_fragment.xml b/sample/res/layout/extension_circle_fragment.xml
index 876e70b..b1bcd76 100644
--- a/sample/res/layout/extension_circle_fragment.xml
+++ b/sample/res/layout/extension_circle_fragment.xml
@@ -1,59 +1,19 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/content"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/fill">
- <RelativeLayout
- android:id="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:background="#333">
- <ImageView
- android:id="@+id/previous"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/previous"/>
+ <RelativeLayout style="@style/footer" android:id="@+id/footer">
- <ImageView
- android:id="@+id/next"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/next"/>
+ <ImageView style="@style/previousButton" android:id="@+id/previous" android:contentDescription="@string/button.previous"/>
- <TextView
+ <ImageView style="@style/nextButton" android:id="@+id/next" android:contentDescription="@string/button.next"/>
+
+ <TextView style="@style/footerNote"
android:id="@+id/note"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_toLeftOf="@id/next"
- android:layout_toRightOf="@id/previous"
- android:layout_centerVertical="true"
- android:text="A slightly more advanced example, this shows a circle that will move and scale with the image. (Due to a limitation in Android, this circle may disappear when it's larger than 2048px.)"
- android:padding="10dp"
- android:textSize="14sp"
- android:textColor="#FFFFFF"/>
+ android:text="@string/extension.p2.text"
+ android:layout_toStartOf="@id/next"
+ android:layout_toEndOf="@id/previous"/>
</RelativeLayout>
- <com.davemorrissey.labs.subscaleview.sample.extension.views.CircleView
- android:id="@+id/imageView"
- android:layout_alignParentTop="true"
- android:layout_above="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
+ <com.davemorrissey.labs.subscaleview.sample.extension.views.CircleView style="@style/mainPanel" android:id="@+id/imageView"/>
</RelativeLayout>
diff --git a/sample/res/layout/extension_freehand_fragment.xml b/sample/res/layout/extension_freehand_fragment.xml
index 3dbab67..006aa0f 100644
--- a/sample/res/layout/extension_freehand_fragment.xml
+++ b/sample/res/layout/extension_freehand_fragment.xml
@@ -1,73 +1,25 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/content"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/fill">
- <RelativeLayout
- android:id="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:background="#333">
- <ImageView
- android:id="@+id/previous"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/previous"/>
+ <RelativeLayout style="@style/footer" android:id="@+id/footer">
- <ImageView
- android:id="@+id/next"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:visibility="invisible"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/next"/>
+ <ImageView style="@style/previousButton" android:id="@+id/previous" android:contentDescription="@string/button.previous"/>
- <ImageView
+ <ImageView style="@style/nextButton" android:id="@+id/next" android:contentDescription="@string/button.next" android:visibility="invisible"/>
+
+ <ImageView style="@style/footerButton"
android:id="@+id/reset"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toLeftOf="@id/next"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/reset"/>
+ android:layout_toStartOf="@id/next"
+ android:src="@drawable/reset"
+ android:contentDescription="@string/button.reset"/>
- <TextView
+ <TextView style="@style/footerNote"
android:id="@+id/note"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_toLeftOf="@id/reset"
- android:layout_toRightOf="@id/previous"
- android:layout_centerVertical="true"
- android:text="This subclass adds event detection. Draw a freehand line; it will move with the image. (Due to a limitation in Android, your drawing may disappear when it's larger than 2048px.)"
- android:padding="10dp"
- android:textSize="14sp"
- android:textColor="#FFFFFF"/>
+ android:text="@string/extension.p3.text"
+ android:layout_toStartOf="@id/reset"
+ android:layout_toEndOf="@id/previous"/>
</RelativeLayout>
- <com.davemorrissey.labs.subscaleview.sample.extension.views.FreehandView
- android:id="@+id/imageView"
- android:layout_alignParentTop="true"
- android:layout_above="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
+ <com.davemorrissey.labs.subscaleview.sample.extension.views.FreehandView style="@style/mainPanel" android:id="@+id/imageView"/>
</RelativeLayout>
diff --git a/sample/res/layout/extension_pin_fragment.xml b/sample/res/layout/extension_pin_fragment.xml
index 982e96f..fd67b84 100644
--- a/sample/res/layout/extension_pin_fragment.xml
+++ b/sample/res/layout/extension_pin_fragment.xml
@@ -1,60 +1,19 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/content"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/fill">
- <RelativeLayout
- android:id="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:background="#333">
- <ImageView
- android:id="@+id/previous"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:visibility="invisible"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/previous"/>
+ <RelativeLayout style="@style/footer" android:id="@+id/footer">
- <ImageView
- android:id="@+id/next"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/next"/>
+ <ImageView style="@style/previousButton" android:id="@+id/previous" android:contentDescription="@string/button.previous" android:visibility="invisible"/>
- <TextView
+ <ImageView style="@style/nextButton" android:id="@+id/next" android:contentDescription="@string/button.next"/>
+
+ <TextView style="@style/footerNote"
android:id="@+id/note"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_toLeftOf="@id/next"
- android:layout_toRightOf="@id/previous"
- android:layout_centerVertical="true"
- android:text="This view class extends the image view, and adds a pin anchored to a point on the image."
- android:padding="10dp"
- android:textSize="14sp"
- android:textColor="#FFFFFF"/>
+ android:text="@string/extension.p1.text"
+ android:layout_toStartOf="@id/next"
+ android:layout_toEndOf="@id/previous"/>
</RelativeLayout>
- <com.davemorrissey.labs.subscaleview.sample.extension.views.PinView
- android:id="@+id/imageView"
- android:layout_alignParentTop="true"
- android:layout_above="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
+ <com.davemorrissey.labs.subscaleview.sample.extension.views.PinView style="@style/mainPanel" android:id="@+id/imageView"/>
</RelativeLayout>
diff --git a/sample/res/layout/fragments_activity.xml b/sample/res/layout/fragments_activity.xml
new file mode 100644
index 0000000..5624f75
--- /dev/null
+++ b/sample/res/layout/fragments_activity.xml
@@ -0,0 +1,5 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/fill">
+
+ <FrameLayout android:id="@+id/frame" style="@style/fill"/>
+
+</RelativeLayout>
diff --git a/sample/res/layout/imagedisplay_large_fragment.xml b/sample/res/layout/imagedisplay_large_fragment.xml
index ed09b9c..442fc67 100644
--- a/sample/res/layout/imagedisplay_large_fragment.xml
+++ b/sample/res/layout/imagedisplay_large_fragment.xml
@@ -1,60 +1,19 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/content"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/fill">
- <RelativeLayout
- android:id="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:background="#333">
- <ImageView
- android:id="@+id/previous"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:visibility="invisible"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/previous"/>
+ <RelativeLayout style="@style/footer" android:id="@+id/footer">
- <ImageView
- android:id="@+id/next"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/next"/>
+ <ImageView style="@style/previousButton" android:id="@+id/previous" android:contentDescription="@string/button.previous" android:visibility="invisible"/>
- <TextView
+ <ImageView style="@style/nextButton" android:id="@+id/next" android:contentDescription="@string/button.next"/>
+
+ <TextView style="@style/footerNote"
android:id="@+id/note"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_toLeftOf="@id/next"
- android:layout_toRightOf="@id/previous"
- android:layout_centerVertical="true"
- android:text="This image is 7,557 x 5,669 pixels. On most devices it will be subsampled, and higher quality tiles are loaded as you zoom in."
- android:padding="10dp"
- android:textSize="14sp"
- android:textColor="#FFFFFF"/>
+ android:text="@string/display.p1.text"
+ android:layout_toStartOf="@id/next"
+ android:layout_toEndOf="@id/previous"/>
</RelativeLayout>
- <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
- android:id="@+id/imageView"
- android:layout_alignParentTop="true"
- android:layout_above="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
+ <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView style="@style/mainPanel" android:id="@+id/imageView"/>
</RelativeLayout>
diff --git a/sample/res/layout/imagedisplay_region_fragment.xml b/sample/res/layout/imagedisplay_region_fragment.xml
index bb0ec2b..6c8b3d2 100644
--- a/sample/res/layout/imagedisplay_region_fragment.xml
+++ b/sample/res/layout/imagedisplay_region_fragment.xml
@@ -1,73 +1,25 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/content"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/fill">
- <RelativeLayout
- android:id="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:background="#333">
- <ImageView
- android:id="@+id/previous"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/previous"/>
+ <RelativeLayout style="@style/footer" android:id="@+id/footer">
- <ImageView
- android:id="@+id/next"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:visibility="invisible"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/next"/>
+ <ImageView style="@style/previousButton" android:id="@+id/previous" android:contentDescription="@string/button.previous"/>
- <ImageView
- android:id="@+id/rotate"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toLeftOf="@id/next"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/rotate"/>
+ <ImageView style="@style/nextButton" android:id="@+id/next" android:contentDescription="@string/button.next" android:visibility="invisible"/>
- <TextView
- android:id="@+id/note"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_toLeftOf="@id/rotate"
- android:layout_toRightOf="@id/previous"
- android:layout_centerVertical="true"
- android:text="Set the region to display instead of the whole image."
- android:padding="10dp"
- android:textSize="14sp"
- android:textColor="#FFFFFF"/>
+ <ImageView style="@style/footerButton"
+ android:id="@+id/rotate"
+ android:layout_toStartOf="@id/next"
+ android:src="@drawable/rotate"
+ android:contentDescription="@string/button.rotate"/>
+
+ <TextView style="@style/footerNote"
+ android:id="@+id/note"
+ android:text="@string/display.p3.text"
+ android:layout_toStartOf="@id/rotate"
+ android:layout_toEndOf="@id/previous"/>
</RelativeLayout>
- <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
- android:id="@+id/imageView"
- android:layout_alignParentTop="true"
- android:layout_above="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
+ <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView style="@style/mainPanel" android:id="@+id/imageView"/>
</RelativeLayout>
diff --git a/sample/res/layout/imagedisplay_rotate_fragment.xml b/sample/res/layout/imagedisplay_rotate_fragment.xml
index 296dc5d..9dbf50a 100644
--- a/sample/res/layout/imagedisplay_rotate_fragment.xml
+++ b/sample/res/layout/imagedisplay_rotate_fragment.xml
@@ -1,72 +1,25 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/content"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/fill">
- <RelativeLayout
- android:id="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:background="#333">
- <ImageView
- android:id="@+id/previous"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/previous"/>
+ <RelativeLayout style="@style/footer" android:id="@+id/footer">
- <ImageView
- android:id="@+id/next"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/next"/>
+ <ImageView style="@style/previousButton" android:id="@+id/previous" android:contentDescription="@string/button.previous"/>
- <ImageView
+ <ImageView style="@style/nextButton" android:id="@+id/next" android:contentDescription="@string/button.next"/>
+
+ <ImageView style="@style/footerButton"
android:id="@+id/rotate"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toLeftOf="@id/next"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/rotate"/>
+ android:layout_toStartOf="@id/next"
+ android:src="@drawable/rotate"
+ android:contentDescription="@string/button.rotate"/>
- <TextView
+ <TextView style="@style/footerNote"
android:id="@+id/note"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_toLeftOf="@id/rotate"
- android:layout_toRightOf="@id/previous"
- android:layout_centerVertical="true"
- android:text="This image has been rotated 90 degrees. Tap the button to rotate it. EXIF rotation is supported for external files."
- android:padding="10dp"
- android:textSize="14sp"
- android:textColor="#FFFFFF"/>
+ android:text="@string/display.p2.text"
+ android:layout_toStartOf="@id/rotate"
+ android:layout_toEndOf="@id/previous"/>
</RelativeLayout>
- <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
- android:id="@+id/imageView"
- android:layout_alignParentTop="true"
- android:layout_above="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
+ <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView style="@style/mainPanel" android:id="@+id/imageView"/>
</RelativeLayout>
diff --git a/sample/res/layout/main.xml b/sample/res/layout/main.xml
index 90d81b9..05146e9 100644
--- a/sample/res/layout/main.xml
+++ b/sample/res/layout/main.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" style="@style/fill">
+
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
@@ -14,130 +13,24 @@
android:layout_marginBottom="10dp"
android:orientation="vertical">
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="#333333"/>
-
- <TextView
- android:id="@+id/basicFeatures"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/buttonstate_transparent"
- android:gravity="center_horizontal"
- android:padding="10dp"
- android:textSize="18sp"
- android:text="Basic features"/>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="#333333"/>
-
- <TextView
- android:id="@+id/imageDisplay"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/buttonstate_transparent"
- android:gravity="center_horizontal"
- android:padding="10dp"
- android:textSize="18sp"
- android:text="Image display"/>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="#333333"/>
-
- <TextView
- android:id="@+id/eventHandling"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/buttonstate_transparent"
- android:gravity="center_horizontal"
- android:padding="10dp"
- android:textSize="18sp"
- android:text="Event handling"/>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="#333333"/>
-
- <TextView
- android:id="@+id/advancedEventHandling"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/buttonstate_transparent"
- android:gravity="center_horizontal"
- android:padding="10dp"
- android:textSize="18sp"
- android:text="Advanced event handling"/>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="#333333"/>
-
- <TextView
- android:id="@+id/viewPagerGalleries"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/buttonstate_transparent"
- android:gravity="center_horizontal"
- android:padding="10dp"
- android:textSize="18sp"
- android:text="View pager galleries"/>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="#333333"/>
-
- <TextView
- android:id="@+id/animation"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/buttonstate_transparent"
- android:gravity="center_horizontal"
- android:padding="10dp"
- android:textSize="18sp"
- android:text="Animation"/>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="#333333"/>
-
- <TextView
- android:id="@+id/extension"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/buttonstate_transparent"
- android:gravity="center_horizontal"
- android:padding="10dp"
- android:textSize="18sp"
- android:text="Extension"/>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="#333333"/>
-
- <TextView
- android:id="@+id/configuration"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/buttonstate_transparent"
- android:gravity="center_horizontal"
- android:padding="10dp"
- android:textSize="18sp"
- android:text="Configuration"/>
+ <View style="@style/indexDivider"/>
+ <TextView style="@style/indexLink" android:id="@+id/basicFeatures" android:text="@string/basic.link"/>
+ <View style="@style/indexDivider"/>
+ <TextView style="@style/indexLink" android:id="@+id/imageDisplay" android:text="@string/display.link"/>
+ <View style="@style/indexDivider"/>
+ <TextView style="@style/indexLink" android:id="@+id/eventHandling" android:text="@string/event.link"/>
+ <View style="@style/indexDivider"/>
+ <TextView style="@style/indexLink" android:id="@+id/advancedEventHandling" android:text="@string/advancedevent.link"/>
+ <View style="@style/indexDivider"/>
+ <TextView style="@style/indexLink" android:id="@+id/viewPagerGalleries" android:text="@string/pager.link"/>
+ <View style="@style/indexDivider"/>
+ <TextView style="@style/indexLink" android:id="@+id/animation" android:text="@string/animation.link"/>
+ <View style="@style/indexDivider"/>
+ <TextView style="@style/indexLink" android:id="@+id/extension" android:text="@string/extension.link"/>
+ <View style="@style/indexDivider"/>
+ <TextView style="@style/indexLink" android:id="@+id/configuration" android:text="@string/configuration.link"/>
+ <View style="@style/indexDivider"/>
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:background="#333333"/>
</LinearLayout>
<LinearLayout
@@ -153,7 +46,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:src="@drawable/daffy"/>
+ android:src="@drawable/daffy"
+ android:contentDescription="@string/main.avatar"/>
<TextView
android:layout_width="wrap_content"
@@ -162,7 +56,7 @@
android:gravity="center_horizontal"
android:textSize="13sp"
android:textColor="#777777"
- android:text="by Dave Morrissey"/>
+ android:text="@string/main.attribution"/>
</LinearLayout>
@@ -175,7 +69,7 @@
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textSize="16sp"
- android:text="View on GitHub"/>
+ android:text="@string/main.viewongithub"/>
</LinearLayout>
</ScrollView>
diff --git a/sample/res/layout/notes_activity.xml b/sample/res/layout/notes_activity.xml
deleted file mode 100644
index ef4aef0..0000000
--- a/sample/res/layout/notes_activity.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/content"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
-
- <RelativeLayout
- android:id="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:background="#333">
- <ImageView
- android:id="@+id/previous"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:visibility="invisible"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/previous"/>
-
- <ImageView
- android:id="@+id/next"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/next"/>
-
- <TextView
- android:id="@+id/note"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_toLeftOf="@id/next"
- android:layout_toRightOf="@id/previous"
- android:layout_centerVertical="true"
- android:padding="10dp"
- android:textSize="14sp"
- android:textColor="#FFFFFF"/>
-
- </RelativeLayout>
-
- <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
- android:id="@+id/imageView"
- android:layout_alignParentTop="true"
- android:layout_above="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
-
-</RelativeLayout>
diff --git a/sample/res/layout/pages_activity.xml b/sample/res/layout/pages_activity.xml
new file mode 100644
index 0000000..46014bb
--- /dev/null
+++ b/sample/res/layout/pages_activity.xml
@@ -0,0 +1,18 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/fill">
+
+ <RelativeLayout style="@style/footer" android:id="@+id/footer">
+
+ <ImageView style="@style/previousButton" android:id="@+id/previous" android:contentDescription="@string/button.previous"/>
+
+ <ImageView style="@style/nextButton" android:id="@+id/next" android:contentDescription="@string/button.next"/>
+
+ <TextView style="@style/footerNote"
+ android:id="@+id/note"
+ android:layout_toStartOf="@id/next"
+ android:layout_toEndOf="@id/previous"/>
+
+ </RelativeLayout>
+
+ <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView style="@style/mainPanel" android:id="@+id/imageView"/>
+
+</RelativeLayout>
diff --git a/sample/res/layout/view_pager.xml b/sample/res/layout/view_pager.xml
index 76584e0..c6c7bfc 100644
--- a/sample/res/layout/view_pager.xml
+++ b/sample/res/layout/view_pager.xml
@@ -1,68 +1,20 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/fill">
- <RelativeLayout
- android:id="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:background="#333">
- <ImageView
- android:id="@+id/previous"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:visibility="invisible"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/previous"/>
+ <RelativeLayout style="@style/footer" android:id="@+id/footer">
- <ImageView
- android:id="@+id/next"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:background="@drawable/buttonstate_transparent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:src="@drawable/next"/>
+ <ImageView style="@style/previousButton" android:id="@+id/previous" android:contentDescription="@string/button.previous"/>
- <TextView
+ <ImageView style="@style/nextButton" android:id="@+id/next" android:contentDescription="@string/button.next"/>
+
+ <TextView style="@style/footerNote"
android:id="@+id/note"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_toLeftOf="@id/next"
- android:layout_toRightOf="@id/previous"
- android:layout_centerVertical="true"
- android:padding="10dp"
- android:textSize="14sp"
- android:textColor="#FFFFFF"/>
+ android:layout_toStartOf="@id/next"
+ android:layout_toEndOf="@id/previous"/>
</RelativeLayout>
- <android.support.v4.view.ViewPager
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/horizontal_pager"
- android:visibility="gone"
- android:layout_above="@id/text"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ <android.support.v4.view.ViewPager style="@style/mainPanel" android:id="@+id/horizontal_pager" android:visibility="gone" />
- <com.davemorrissey.labs.subscaleview.sample.viewpager.VerticalViewPager
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/vertical_pager"
- android:visibility="gone"
- android:layout_above="@id/text"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ <com.davemorrissey.labs.subscaleview.sample.viewpager.VerticalViewPager style="@style/mainPanel" android:id="@+id/vertical_pager" android:visibility="gone"/>
</RelativeLayout>
diff --git a/sample/res/layout/view_pager_page.xml b/sample/res/layout/view_pager_page.xml
index 71c8f31..0f1ede4 100644
--- a/sample/res/layout/view_pager_page.xml
+++ b/sample/res/layout/view_pager_page.xml
@@ -1,10 +1,5 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/fill">
- <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
- android:id="@+id/imageView"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
+ <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView style="@style/fill" android:id="@+id/imageView"/>
</RelativeLayout>
diff --git a/sample/res/values/strings.xml b/sample/res/values/strings.xml
new file mode 100644
index 0000000..3c5a1f4
--- /dev/null
+++ b/sample/res/values/strings.xml
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app.name">Scale Image View Demo</string>
+
+ <string name="main.title">Subsampling Scale Image View</string>
+
+ <string name="main.attribution">by Dave Morrissey</string>
+ <string name="main.avatar">Avatar</string>
+ <string name="main.viewongithub">View on GitHub</string>
+
+ <string name="button.animate">Animate</string>
+ <string name="button.next">Next</string>
+ <string name="button.previous">Previous</string>
+ <string name="button.rotate">Rotate</string>
+ <string name="button.reset">Reset</string>
+
+ <string name="basic.link">Basic features</string>
+ <string name="basic.title">Basic features</string>
+ <string name="basic.p1.subtitle">Pinch to zoom</string>
+ <string name="basic.p1.text">
+ Use a two finger pinch to zoom in and out. The zoom is centred on the pinch gesture, and you can pan at the same time.
+ </string>
+ <string name="basic.p2.subtitle">Quick scale</string>
+ <string name="basic.p2.text">
+ Double tap and swipe up or down to zoom in or out. The zoom is centred where you tapped.
+ </string>
+ <string name="basic.p3.subtitle">Drag</string>
+ <string name="basic.p3.text">Use one finger to drag the image around.</string>
+ <string name="basic.p4.subtitle">Fling</string>
+ <string name="basic.p4.text">
+ If you drag quickly and let go, fling momentum keeps the image moving.
+ </string>
+ <string name="basic.p5.subtitle">Double tap</string>
+ <string name="basic.p5.text">
+ Double tap the image to zoom in to that spot. Double tap again to zoom out.
+ </string>
+
+ <string name="display.link">Image display</string>
+ <string name="display.title">Image display</string>
+ <string name="display.p1.subtitle">Large images</string>
+ <string name="display.p1.text">
+ This image is 7,557 x 5,669 pixels. On most devices it will be subsampled, and higher quality tiles are loaded as you zoom in.
+ </string>
+ <string name="display.p2.subtitle">Rotation</string>
+ <string name="display.p2.text">
+ This image has been rotated 90 degrees. Tap the button to rotate it. EXIF rotation is supported for external files.
+ </string>
+ <string name="display.p3.subtitle">Display region</string>
+ <string name="display.p3.text">Set the region to display instead of the whole image.</string>
+
+ <string name="event.link">Event handling</string>
+ <string name="event.title">Event handling</string>
+ <string name="event.p1.subtitle">Simple events</string>
+ <string name="event.p1.text">
+ Touch handling by the image view doesn\'t prevent normal events from working.
+ </string>
+ <string name="event.p2.subtitle">OnClickListener</string>
+ <string name="event.p2.text">
+ This view has an OnClickListener. Tap once to activate the click.
+ </string>
+ <string name="event.p3.subtitle">OnLongClickListener</string>
+ <string name="event.p3.text">
+ This view has an OnLongClickListener. Press and hold to activate it.
+ </string>
+
+ <string name="advancedevent.link">Advanced event handling</string>
+ <string name="advancedevent.title">Advanced event handling</string>
+ <string name="advancedevent.p1.subtitle">Overriding gestures</string>
+ <string name="advancedevent.p1.text">Some gestures can be overridden with your own
+ GestureDetector without affecting the image view. This allows you to get the coordinates of
+ the event.
+ </string>
+ <string name="advancedevent.p2.subtitle">onSingleTapConfirmed</string>
+ <string name="advancedevent.p2.text">onSingleTapConfirmed has been overridden. Tap the image to
+ see coordinates.
+ </string>
+ <string name="advancedevent.p3.subtitle">onDoubleTap</string>
+ <string name="advancedevent.p3.text">onDoubleTap has been overridden. Tap the image to see
+ coordinates. This overrides the default zoom in behaviour.
+ </string>
+ <string name="advancedevent.p4.subtitle">onLongPress</string>
+ <string name="advancedevent.p4.text">onLongPress has been overridden. Press and hold the image
+ to see coordinates.
+ </string>
+ <string name="advancedevent.p5.subtitle">Other events</string>
+ <string name="advancedevent.p5.text">You can override any event you want, but customising swipe,
+ fling and zoom gestures will stop the view working normally.
+ </string>
+
+
+ <string name="pager.link">View pager galleries</string>
+ <string name="pager.title">View pager gallery</string>
+ <string name="pager.p1.subtitle">Horizontal</string>
+ <string name="pager.p1.text">
+ This gallery has two images in a ViewPager. Swipe to move to the
+ next image. If you\'re zoomed in on an image, you need to pan to the right of it, then swipe
+ again to activate the pager.
+ </string>
+ <string name="pager.p2.subtitle">Vertical</string>
+ <string name="pager.p2.text">
+ Vertical view pagers are also supported. Swipe up to move to the
+ next image. If you\'re zoomed in on an image, you need to pan to the bottom of it, then
+ swipe again to activate the pager.
+ </string>
+
+ <string name="animation.link">Animation</string>
+ <string name="animation.title">Animation</string>
+ <string name="animation.p1.subtitle">A demo</string>
+ <string name="animation.p1.text">
+ Tap the play button. The image will scale and zoom to a random point, shown by a marker.
+ </string>
+ <string name="animation.p2.subtitle">Limited pan</string>
+ <string name="animation.p2.text">
+ If the target point is near the edge of the image, it will be moved as near to the center as possible.
+ </string>
+ <string name="animation.p3.subtitle">Unlimited pan</string>
+ <string name="animation.p3.text">
+ With unlimited or center-limited pan, the target point can always be animated to the center.
+ </string>
+ <string name="animation.p4.subtitle">Customisation</string>
+ <string name="animation.p4.text">
+ Duration and easing are configurable. You can also make animations non-interruptible.
+ </string>
+
+ <string name="extension.link">Extension</string>
+ <string name="extension.title">Extension</string>
+ <string name="extension.p1.subtitle">Location pin</string>
+ <string name="extension.p1.text">
+ This view class extends the image view, and adds a pin anchored to a point on the image.
+ </string>
+ <string name="extension.p2.subtitle">Overlaid circle</string>
+ <string name="extension.p2.text">
+ A slightly more advanced example, this shows a circle that will
+ move and scale with the image. (Due to a limitation in Android, this circle may disappear
+ when it\'s larger than 2048px.)
+ </string>
+ <string name="extension.p3.subtitle">Freehand drawing</string>
+ <string name="extension.p3.text">
+ This subclass adds event detection. Draw a freehand line; it
+ will move with the image. (Due to a limitation in Android, your drawing may disappear when
+ it\'s larger than 2048px.)
+ </string>
+
+ <string name="configuration.link">Configuration</string>
+ <string name="configuration.title">Configuration</string>
+ <string name="configuration.p1.subtitle">Maximum scale</string>
+ <string name="configuration.p1.text">
+ The maximum scale has been set to 50dpi. You can zoom in until the image is very pixellated.
+ </string>
+ <string name="configuration.p2.subtitle">Minimum tile DPI</string>
+ <string name="configuration.p2.text">
+ The minimum tile DPI has been set to 50dpi, to reduce
+ memory usage. The next layer of tiles will not be loaded until the image is very pixellated.
+ </string>
+ <string name="configuration.p3.subtitle">Pan disabled</string>
+ <string name="configuration.p3.text">
+ Dragging has been disabled. You can only zoom in to the centre point.
+ </string>
+ <string name="configuration.p4.subtitle">Zoom disabled</string>
+ <string name="configuration.p4.text">
+ Zooming has been disabled. You can drag the image around.
+ </string>
+ <string name="configuration.p5.subtitle">Double tap style</string>
+ <string name="configuration.p5.text">
+ On double tap, the tapped point is now zoomed to the center of the screen instead of remaining in the same place.
+ </string>
+ <string name="configuration.p6.subtitle">Double tap style</string>
+ <string name="configuration.p6.text">On double tap, the zoom now happens immediately.</string>
+ <string name="configuration.p7.subtitle">Double tap scale</string>
+ <string name="configuration.p7.text">The double tap zoom scale has been set to 240dpi.</string>
+ <string name="configuration.p8.subtitle">Pan limit center</string>
+ <string name="configuration.p8.text">
+ The pan limit has been changed to PAN_LIMIT_CENTER. Panning stops when a corner reaches the centre of the screen.
+ </string>
+ <string name="configuration.p9.subtitle">Pan limit outside</string>
+ <string name="configuration.p9.text">
+ The pan limit has been changed to PAN_LIMIT_OUTSIDE. Panning stops when the image is just off screen.
+ </string>
+ <string name="configuration.p10.subtitle">Debug</string>
+ <string name="configuration.p10.text">
+ Debug has been enabled. This shows the tile boundaries and sizes.
+ </string>
+
+</resources> \ No newline at end of file
diff --git a/sample/res/values/style.xml b/sample/res/values/style.xml
index a9489ff..023db6e 100644
--- a/sample/res/values/style.xml
+++ b/sample/res/values/style.xml
@@ -1,13 +1,78 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <style name="demoTheme" parent="@android:style/Theme.Holo">
- <item name="android:actionBarStyle">@style/demoActionBar</item>
+ <style name="sampleTheme" parent="@android:style/Theme.Holo">
+ <item name="android:actionBarStyle">@style/sampleActionBar</item>
<item name="android:windowBackground">@color/background</item>
</style>
- <style name="demoActionBar" parent="@android:style/Widget.Holo.ActionBar">
+ <style name="sampleActionBar" parent="@android:style/Widget.Holo.ActionBar">
<item name="android:background">@color/actionBarBackground</item>
</style>
+ <style name="indexDivider">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">1px</item>
+ <item name="android:background">#333333</item>
+ </style>
+
+ <style name="indexLink">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:background">@drawable/buttonstate_transparent</item>
+ <item name="android:gravity">center_horizontal</item>
+ <item name="android:padding">10dp</item>
+ <item name="android:textSize">18sp</item>
+ </style>
+
+ <style name="fill">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">match_parent</item>
+ </style>
+
+ <style name="mainPanel">
+ <item name="android:layout_alignParentTop">true</item>
+ <item name="android:layout_above">@+id/footer</item>
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">match_parent</item>
+ </style>
+
+ <style name="footer">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_alignParentBottom">true</item>
+ <item name="android:background">#333</item>
+ </style>
+
+ <style name="footerNote">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_centerVertical">true</item>
+ <item name="android:padding">10dp</item>
+ <item name="android:textSize">14sp</item>
+ <item name="android:textColor">#FFFFFF</item>
+ </style>
+
+ <style name="footerButton">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_centerVertical">true</item>
+ <item name="android:background">@drawable/buttonstate_transparent</item>
+ <item name="android:paddingLeft">8dp</item>
+ <item name="android:paddingRight">8dp</item>
+ <item name="android:paddingTop">18dp</item>
+ <item name="android:paddingBottom">18dp</item>
+ <item name="android:src">@drawable/previous</item>
+ </style>
+
+ <style name="previousButton" parent="@style/footerButton">
+ <item name="android:layout_alignParentStart">true</item>
+ <item name="android:src">@drawable/previous</item>
+ </style>
+
+ <style name="nextButton" parent="@style/footerButton">
+ <item name="android:layout_alignParentEnd">true</item>
+ <item name="android:src">@drawable/next</item>
+ </style>
+
</resources>
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/AbstractFragmentsActivity.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/AbstractFragmentsActivity.java
new file mode 100644
index 0000000..1bbe522
--- /dev/null
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/AbstractFragmentsActivity.java
@@ -0,0 +1,98 @@
+/*
+Copyright 2017 David Morrissey
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package com.davemorrissey.labs.subscaleview.sample;
+
+import android.app.ActionBar;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.FragmentActivity;
+import android.view.MenuItem;
+
+import java.util.List;
+
+public abstract class AbstractFragmentsActivity extends FragmentActivity {
+
+ private static final String BUNDLE_PAGE = "page";
+
+ private int page;
+
+ private final int title;
+ private final int layout;
+ private final List<Page> notes;
+
+ protected abstract void onPageChanged(int page);
+
+ protected AbstractFragmentsActivity(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);
+ }
+ 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);
+ }
+
+}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/AbstractPagesActivity.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/AbstractPagesActivity.java
new file mode 100644
index 0000000..de0711f
--- /dev/null
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/AbstractPagesActivity.java
@@ -0,0 +1,115 @@
+/*
+Copyright 2017 David Morrissey
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package com.davemorrissey.labs.subscaleview.sample;
+
+import android.app.ActionBar;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.FragmentActivity;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.TextView;
+
+import java.util.List;
+
+public abstract class AbstractPagesActivity extends FragmentActivity {
+
+ private static final String BUNDLE_PAGE = "page";
+
+ private int page;
+
+ private final int title;
+ private final int layout;
+ private final List<Page> notes;
+
+ 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(new View.OnClickListener() {
+ @Override public void onClick(View v) { next(); }
+ });
+ findViewById(R.id.previous).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View 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) {
+
+ }
+
+}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/MainActivity.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/MainActivity.java
index bed7e4f..f49bf8f 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/MainActivity.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/MainActivity.java
@@ -16,12 +16,13 @@ limitations under the License.
package com.davemorrissey.labs.subscaleview.sample;
+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 android.view.View.OnClickListener;
+
import com.davemorrissey.labs.subscaleview.sample.R.id;
import com.davemorrissey.labs.subscaleview.sample.animation.AnimationActivity;
import com.davemorrissey.labs.subscaleview.sample.basicfeatures.BasicFeaturesActivity;
@@ -32,12 +33,15 @@ import com.davemorrissey.labs.subscaleview.sample.extension.ExtensionActivity;
import com.davemorrissey.labs.subscaleview.sample.imagedisplay.ImageDisplayActivity;
import com.davemorrissey.labs.subscaleview.sample.viewpager.ViewPagerActivity;
-public class MainActivity extends Activity implements OnClickListener {
+public class MainActivity extends Activity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- getActionBar().setTitle("Subsampling Scale Image View");
+ 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);
@@ -47,49 +51,41 @@ public class MainActivity extends Activity implements OnClickListener {
findViewById(id.animation).setOnClickListener(this);
findViewById(id.extension).setOnClickListener(this);
findViewById(id.configuration).setOnClickListener(this);
-
findViewById(id.github).setOnClickListener(this);
findViewById(id.self).setOnClickListener(this);
}
@Override
public void onClick(View view) {
- if (view.getId() == id.basicFeatures) {
- Intent intent = new Intent(this, BasicFeaturesActivity.class);
- startActivity(intent);
- } else if (view.getId() == id.imageDisplay) {
- Intent intent = new Intent(this, ImageDisplayActivity.class);
- startActivity(intent);
- } else if (view.getId() == id.eventHandling) {
- Intent intent = new Intent(this, EventHandlingActivity.class);
- startActivity(intent);
- } else if (view.getId() == id.advancedEventHandling) {
- Intent intent = new Intent(this, AdvancedEventHandlingActivity.class);
- startActivity(intent);
- } else if (view.getId() == id.viewPagerGalleries) {
- Intent intent = new Intent(this, ViewPagerActivity.class);
- startActivity(intent);
- } else if (view.getId() == id.animation) {
- Intent intent = new Intent(this, AnimationActivity.class);
- startActivity(intent);
- } else if (view.getId() == id.extension) {
- Intent intent = new Intent(this, ExtensionActivity.class);
- startActivity(intent);
- } else if (view.getId() == id.configuration) {
- Intent intent = new Intent(this, ConfigurationActivity.class);
- startActivity(intent);
- } else if (view.getId() == id.github) {
- String url = "https://github.com/davemorrissey/subsampling-scale-image-view";
- Intent i = new Intent(Intent.ACTION_VIEW);
- i.setData(Uri.parse(url));
- startActivity(i);
- } else if (view.getId() == id.self) {
- String url = "http://www.davemorrissey.com";
- Intent i = new Intent(Intent.ACTION_VIEW);
- i.setData(Uri.parse(url));
- startActivity(i);
+ 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;
+ case id.self: openSelf(); 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);
+ }
+ private void openSelf() {
+ Intent i = new Intent(Intent.ACTION_VIEW);
+ i.setData(Uri.parse("http://www.davemorrissey.com"));
+ startActivity(i);
}
@Override
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/Page.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/Page.java
new file mode 100644
index 0000000..f489f6e
--- /dev/null
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/Page.java
@@ -0,0 +1,37 @@
+/*
+Copyright 2017 David Morrissey
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package com.davemorrissey.labs.subscaleview.sample;
+
+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;
+ }
+}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/animation/AnimationActivity.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/animation/AnimationActivity.java
index 6dedd36..008691d 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/animation/AnimationActivity.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/animation/AnimationActivity.java
@@ -16,124 +16,71 @@ limitations under the License.
package com.davemorrissey.labs.subscaleview.sample.animation;
-import android.app.Activity;
import android.graphics.PointF;
import android.os.Bundle;
-import android.view.MenuItem;
+import android.support.annotation.Nullable;
import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.TextView;
import com.davemorrissey.labs.subscaleview.ImageSource;
-import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView.AnimationBuilder;
+import com.davemorrissey.labs.subscaleview.sample.AbstractPagesActivity;
+import com.davemorrissey.labs.subscaleview.sample.Page;
import com.davemorrissey.labs.subscaleview.sample.R.id;
-import com.davemorrissey.labs.subscaleview.sample.R.layout;
import com.davemorrissey.labs.subscaleview.sample.extension.views.PinView;
import java.util.Arrays;
-import java.util.List;
import java.util.Random;
-public class AnimationActivity extends Activity implements OnClickListener {
+import static com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView.*;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.*;
+import static com.davemorrissey.labs.subscaleview.sample.R.layout.*;
- private static final String BUNDLE_POSITION = "position";
+public class AnimationActivity extends AbstractPagesActivity {
- private int position;
+ private PinView view;
- private List<Note> notes;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(layout.animation_activity);
- getActionBar().setTitle("Animation");
- getActionBar().setDisplayHomeAsUpEnabled(true);
- findViewById(id.next).setOnClickListener(this);
- findViewById(id.previous).setOnClickListener(this);
- findViewById(id.play).setOnClickListener(this);
- if (savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_POSITION)) {
- position = savedInstanceState.getInt(BUNDLE_POSITION);
- }
- notes = Arrays.asList(
- new Note("A demo", "Tap the play button. The image will scale and zoom to a random point, shown by a marker."),
- new Note("Limited pan", "If the target point is near the edge of the image, it will be moved as near to the center as possible."),
- new Note("Unlimited pan", "With unlimited or center-limited pan, the target point can always be animated to the center."),
- new Note("Customisation", "Duration and easing are configurable. You can also make animations non-interruptible.")
- );
-
- initialiseImage();
- updateNotes();
+ 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 onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putInt(BUNDLE_POSITION, position);
- }
-
- @Override
- public void onClick(View view) {
- if (view.getId() == id.next) {
- position++;
- updateNotes();
- } else if (view.getId() == id.previous) {
- position--;
- updateNotes();
- } else if (view.getId() == id.play) {
- PinView pinView = (PinView)findViewById(id.imageView);
- Random random = new Random();
- if (pinView.isReady()) {
- float maxScale = pinView.getMaxScale();
- float minScale = pinView.getMinScale();
- float scale = (random.nextFloat() * (maxScale - minScale)) + minScale;
- PointF center = new PointF(random.nextInt(pinView.getSWidth()), random.nextInt(pinView.getSHeight()));
- pinView.setPin(center);
- AnimationBuilder animationBuilder = pinView.animateScaleAndCenter(scale, center);
- if (position == 3) {
- animationBuilder.withDuration(2000).withEasing(SubsamplingScaleImageView.EASE_OUT_QUAD).withInterruptible(false).start();
- } else {
- animationBuilder.withDuration(750).start();
- }
- }
- }
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ findViewById(id.play).setOnClickListener(new OnClickListener() {
+ @Override public void onClick(View v) { AnimationActivity.this.play(); }
+ });
+ view = findViewById(id.imageView);
+ view.setImage(ImageSource.asset("squirrel.jpg"));
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
- finish();
- return true;
- }
-
- private void initialiseImage() {
- SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(id.imageView);
- imageView.setImage(ImageSource.asset("squirrel.jpg"));
- }
-
- private void updateNotes() {
- if (position > notes.size() - 1) {
- return;
- }
- getActionBar().setSubtitle(notes.get(position).subtitle);
- ((TextView)findViewById(id.note)).setText(notes.get(position).text);
- findViewById(id.next).setVisibility(position >= notes.size() - 1 ? View.INVISIBLE : View.VISIBLE);
- findViewById(id.previous).setVisibility(position <= 0 ? View.INVISIBLE : View.VISIBLE);
-
- SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(id.imageView);
- if (position == 2) {
- imageView.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_CENTER);
+ protected void onPageChanged(int page) {
+ if (page == 2) {
+ view.setPanLimit(PAN_LIMIT_CENTER);
} else {
- imageView.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_INSIDE);
+ view.setPanLimit(PAN_LIMIT_INSIDE);
}
-
}
- private static final class Note {
- private final String text;
- private final String subtitle;
- private Note(String subtitle, String text) {
- this.subtitle = subtitle;
- this.text = text;
+ 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();
+ }
}
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/basicfeatures/BasicFeaturesActivity.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/basicfeatures/BasicFeaturesActivity.java
index ddb0887..a89619a 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/basicfeatures/BasicFeaturesActivity.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/basicfeatures/BasicFeaturesActivity.java
@@ -16,98 +16,37 @@ limitations under the License.
package com.davemorrissey.labs.subscaleview.sample.basicfeatures;
-import android.app.Activity;
import android.os.Bundle;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.TextView;
+import android.support.annotation.Nullable;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.sample.AbstractPagesActivity;
+import com.davemorrissey.labs.subscaleview.sample.Page;
import com.davemorrissey.labs.subscaleview.sample.R.id;
-import com.davemorrissey.labs.subscaleview.sample.R.layout;
-import com.davemorrissey.labs.subscaleview.sample.imagedisplay.decoders.RapidImageRegionDecoder;
import java.util.Arrays;
-import java.util.List;
-public class BasicFeaturesActivity extends Activity implements OnClickListener {
+import static com.davemorrissey.labs.subscaleview.sample.R.string.*;
+import static com.davemorrissey.labs.subscaleview.sample.R.layout.*;
- private static final String BUNDLE_POSITION = "position";
+public class BasicFeaturesActivity extends AbstractPagesActivity {
- private int position;
-
- private List<Note> notes;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(layout.notes_activity);
- getActionBar().setTitle("Basic features");
- getActionBar().setDisplayHomeAsUpEnabled(true);
- findViewById(id.next).setOnClickListener(this);
- findViewById(id.previous).setOnClickListener(this);
- if (savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_POSITION)) {
- position = savedInstanceState.getInt(BUNDLE_POSITION);
- }
- notes = Arrays.asList(
- new Note("Pinch to zoom", "Use a two finger pinch to zoom in and out. The zoom is centred on the pinch gesture, and you can pan at the same time."),
- new Note("Quick scale", "Double tap and swipe up or down to zoom in or out. The zoom is centred where you tapped."),
- new Note("Drag", "Use one finger to drag the image around."),
- new Note("Fling", "If you drag quickly and let go, fling momentum keeps the image moving."),
- new Note("Double tap", "Double tap the image to zoom in to that spot. Double tap again to zoom out.")
- );
-
- initialiseImage();
- updateNotes();
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putInt(BUNDLE_POSITION, position);
- }
-
- @Override
- public void onClick(View view) {
- if (view.getId() == id.next) {
- position++;
- updateNotes();
- } else if (view.getId() == id.previous) {
- position--;
- updateNotes();
- }
+ 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
- public boolean onOptionsItemSelected(MenuItem item) {
- finish();
- return true;
- }
-
- private void initialiseImage() {
- SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(id.imageView);
- imageView.setImage(ImageSource.asset("squirrel.jpg"));
- }
-
- private void updateNotes() {
- if (position > notes.size() - 1) {
- return;
- }
- getActionBar().setSubtitle(notes.get(position).subtitle);
- ((TextView)findViewById(id.note)).setText(notes.get(position).text);
- findViewById(id.next).setVisibility(position >= notes.size() - 1 ? View.INVISIBLE : View.VISIBLE);
- findViewById(id.previous).setVisibility(position <= 0 ? View.INVISIBLE : View.VISIBLE);
- }
-
- private static final class Note {
- private final String text;
- private final String subtitle;
- private Note(String subtitle, String text) {
- this.subtitle = subtitle;
- this.text = text;
- }
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ SubsamplingScaleImageView view = findViewById(id.imageView);
+ view.setImage(ImageSource.asset("pony.jpg"));
}
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/configuration/ConfigurationActivity.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/configuration/ConfigurationActivity.java
index 71f29db..39c4b24 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/configuration/ConfigurationActivity.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/configuration/ConfigurationActivity.java
@@ -16,150 +16,94 @@ limitations under the License.
package com.davemorrissey.labs.subscaleview.sample.configuration;
-import android.app.Activity;
import android.graphics.PointF;
import android.os.Bundle;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.TextView;
+import android.support.annotation.Nullable;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.sample.AbstractPagesActivity;
+import com.davemorrissey.labs.subscaleview.sample.Page;
import com.davemorrissey.labs.subscaleview.sample.R.id;
-import com.davemorrissey.labs.subscaleview.sample.R.layout;
import java.util.Arrays;
-import java.util.List;
-public class ConfigurationActivity extends Activity implements OnClickListener {
-
- private static final String BUNDLE_POSITION = "position";
-
- private int position;
-
- private List<Note> notes;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(layout.notes_activity);
- getActionBar().setTitle("Configuration");
- getActionBar().setDisplayHomeAsUpEnabled(true);
- findViewById(id.next).setOnClickListener(this);
- findViewById(id.previous).setOnClickListener(this);
- if (savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_POSITION)) {
- position = savedInstanceState.getInt(BUNDLE_POSITION);
- }
- notes = Arrays.asList(
- new Note("Maximum scale", "The maximum scale has been set to 50dpi. You can zoom in until the image is very pixellated."),
- new Note("Minimum tile DPI", "The minimum tile DPI has been set to 50dpi, to reduce memory usage. The next layer of tiles will not be loaded until the image is very pixellated."),
- new Note("Pan disabled", "Dragging has been disabled. You can only zoom in to the centre point."),
- new Note("Zoom disabled", "Zooming has been disabled. You can drag the image around."),
- new Note("Double tap style", "On double tap, the tapped point is now zoomed to the center of the screen instead of remaining in the same place."),
- new Note("Double tap style", "On double tap, the zoom now happens immediately."),
- new Note("Double tap scale", "The double tap zoom scale has been set to 240dpi."),
- new Note("Pan limit center", "The pan limit has been changed to PAN_LIMIT_CENTER. Panning stops when a corner reaches the centre of the screen."),
- new Note("Pan limit outside", "The pan limit has been changed to PAN_LIMIT_OUTSIDE. Panning stops when the image is just off screen."),
- new Note("Debug", "Debug has been enabled. This shows the tile boundaries and sizes.")
- );
-
- initialiseImage();
- updateNotes();
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putInt(BUNDLE_POSITION, position);
+import static com.davemorrissey.labs.subscaleview.sample.R.string.*;
+import static com.davemorrissey.labs.subscaleview.sample.R.layout.*;
+
+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
- public void onClick(View view) {
- if (view.getId() == id.next) {
- position++;
- updateNotes();
- } else if (view.getId() == id.previous) {
- position--;
- updateNotes();
- }
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ view = findViewById(id.imageView);
+ view.setImage(ImageSource.asset("eagle.jpg"));
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
- finish();
- return true;
- }
-
- private void initialiseImage() {
- SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(id.imageView);
- imageView.setImage(ImageSource.asset("squirrel.jpg"));
- }
-
- private void updateNotes() {
- if (position > notes.size() - 1) {
- return;
- }
- getActionBar().setSubtitle(notes.get(position).subtitle);
- ((TextView)findViewById(id.note)).setText(notes.get(position).text);
- findViewById(id.next).setVisibility(position >= notes.size() - 1 ? View.INVISIBLE : View.VISIBLE);
- findViewById(id.previous).setVisibility(position <= 0 ? View.INVISIBLE : View.VISIBLE);
-
- SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(id.imageView);
- if (position == 0) {
- imageView.setMinimumDpi(50);
+ protected void onPageChanged(int page) {
+ if (page == 0) {
+ view.setMinimumDpi(50);
} else {
- imageView.setMaxScale(2F);
+ view.setMaxScale(2F);
}
- if (position == 1) {
- imageView.setMinimumTileDpi(50);
+ if (page == 1) {
+ view.setMinimumTileDpi(50);
} else {
- imageView.setMinimumTileDpi(500);
+ view.setMinimumTileDpi(500);
}
- if (position == 4) {
- imageView.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER);
- } else if (position == 5) {
- imageView.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER_IMMEDIATE);
+ if (page == 4) {
+ view.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER);
+ } else if (page == 5) {
+ view.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER_IMMEDIATE);
} else {
- imageView.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_FIXED);
+ view.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_FIXED);
}
- if (position == 6) {
- imageView.setDoubleTapZoomDpi(240);
+ if (page == 6) {
+ view.setDoubleTapZoomDpi(240);
} else {
- imageView.setDoubleTapZoomScale(1F);
+ view.setDoubleTapZoomScale(1F);
}
- if (position == 7) {
- imageView.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_CENTER);
- } else if (position == 8) {
- imageView.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_OUTSIDE);
+ if (page == 7) {
+ view.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_CENTER);
+ } else if (page == 8) {
+ view.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_OUTSIDE);
} else {
- imageView.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_INSIDE);
+ view.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_INSIDE);
}
- if (position == 9) {
- imageView.setDebug(true);
+ if (page == 9) {
+ view.setDebug(true);
} else {
- imageView.setDebug(false);
+ view.setDebug(false);
}
- if (position == 2) {
- imageView.setScaleAndCenter(0f, new PointF(1228, 816));
- imageView.setPanEnabled(false);
+ if (page == 2) {
+ view.setScaleAndCenter(0f, new PointF(2456, 1632));
+ view.setPanEnabled(false);
} else {
- imageView.setPanEnabled(true);
+ view.setPanEnabled(true);
}
- if (position == 3) {
- imageView.setScaleAndCenter(1f, new PointF(1228, 816));
- imageView.setZoomEnabled(false);
+ if (page == 3) {
+ view.setScaleAndCenter(1f, new PointF(2456, 1632));
+ view.setZoomEnabled(false);
} else {
- imageView.setZoomEnabled(true);
- }
- }
-
- private static final class Note {
- private final String text;
- private final String subtitle;
- private Note(String subtitle, String text) {
- this.subtitle = subtitle;
- this.text = text;
+ view.setZoomEnabled(true);
}
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/eventhandling/EventHandlingActivity.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/eventhandling/EventHandlingActivity.java
index acce3cd..bd5613a 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/eventhandling/EventHandlingActivity.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/eventhandling/EventHandlingActivity.java
@@ -16,110 +16,42 @@ limitations under the License.
package com.davemorrissey.labs.subscaleview.sample.eventhandling;
-import android.app.Activity;
import android.os.Bundle;
-import android.view.MenuItem;
import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnLongClickListener;
-import android.widget.TextView;
import android.widget.Toast;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.sample.AbstractPagesActivity;
+import com.davemorrissey.labs.subscaleview.sample.Page;
import com.davemorrissey.labs.subscaleview.sample.R.id;
-import com.davemorrissey.labs.subscaleview.sample.R.layout;
import java.util.Arrays;
-import java.util.List;
-public class EventHandlingActivity extends Activity implements OnClickListener, OnLongClickListener {
+import static com.davemorrissey.labs.subscaleview.sample.R.layout.*;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.*;
- private static final String BUNDLE_POSITION = "position";
+public class EventHandlingActivity extends AbstractPagesActivity {
- private int position;
-
- private List<Note> notes;
+ 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);
- setContentView(layout.notes_activity);
- getActionBar().setTitle("Event handling");
- getActionBar().setDisplayHomeAsUpEnabled(true);
- findViewById(id.next).setOnClickListener(this);
- findViewById(id.previous).setOnClickListener(this);
- findViewById(id.imageView).setOnClickListener(this);
- findViewById(id.imageView).setOnLongClickListener(this);
- if (savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_POSITION)) {
- position = savedInstanceState.getInt(BUNDLE_POSITION);
- }
- notes = Arrays.asList(
- new Note("Simple events", "Touch handling by the image view doesn't prevent normal events from working."),
- new Note("OnClickListener", "This view has an OnClickListener. Tap once to activate the click."),
- new Note("OnLongClickListener", "This view has an OnLongClickListener. Press and hold to activate it.")
- );
-
- initialiseImage();
- updateNotes();
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putInt(BUNDLE_POSITION, position);
- }
-
- @Override
- public void onClick(View view) {
- if (view.getId() == id.next) {
- position++;
- updateNotes();
- } else if (view.getId() == id.previous) {
- position--;
- updateNotes();
- } else if (view.getId() == id.imageView) {
- Toast.makeText(this, "Clicked", Toast.LENGTH_SHORT).show();
- }
- }
-
- @Override
- public boolean onLongClick(View view) {
- if (view.getId() == id.imageView) {
- Toast.makeText(this, "Long clicked", Toast.LENGTH_SHORT).show();
- return true;
- }
- return false;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- finish();
- return true;
- }
-
- private void initialiseImage() {
- SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(id.imageView);
- imageView.setImage(ImageSource.asset("squirrel.jpg"));
- }
-
- private void updateNotes() {
- if (position > notes.size() - 1) {
- return;
- }
- getActionBar().setSubtitle(notes.get(position).subtitle);
- ((TextView)findViewById(id.note)).setText(notes.get(position).text);
- findViewById(id.next).setVisibility(position >= notes.size() - 1 ? View.INVISIBLE : View.VISIBLE);
- findViewById(id.previous).setVisibility(position <= 0 ? View.INVISIBLE : View.VISIBLE);
- }
-
- private static final class Note {
- private final String text;
- private final String subtitle;
- private Note(String subtitle, String text) {
- this.subtitle = subtitle;
- this.text = text;
- }
+ SubsamplingScaleImageView imageView = findViewById(id.imageView);
+ imageView.setImage(ImageSource.asset("pony.jpg"));
+ imageView.setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { Toast.makeText(v.getContext(), "Clicked", Toast.LENGTH_SHORT).show(); }
+ });
+ imageView.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override public boolean onLongClick(View v) { Toast.makeText(v.getContext(), "Long clicked", Toast.LENGTH_SHORT).show(); return true; }
+ });
}
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/eventhandlingadvanced/AdvancedEventHandlingActivity.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/eventhandlingadvanced/AdvancedEventHandlingActivity.java
index be2d60c..e2c34fd 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/eventhandlingadvanced/AdvancedEventHandlingActivity.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/eventhandlingadvanced/AdvancedEventHandlingActivity.java
@@ -16,82 +16,40 @@ limitations under the License.
package com.davemorrissey.labs.subscaleview.sample.eventhandlingadvanced;
-import android.app.Activity;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.GestureDetector;
-import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnTouchListener;
-import android.widget.TextView;
import android.widget.Toast;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.sample.AbstractPagesActivity;
+import com.davemorrissey.labs.subscaleview.sample.Page;
import com.davemorrissey.labs.subscaleview.sample.R.id;
-import com.davemorrissey.labs.subscaleview.sample.R.layout;
import java.util.Arrays;
-import java.util.List;
-public class AdvancedEventHandlingActivity extends Activity implements OnClickListener {
+import static com.davemorrissey.labs.subscaleview.sample.R.string.*;
+import static com.davemorrissey.labs.subscaleview.sample.R.layout.*;
- private static final String BUNDLE_POSITION = "position";
+public class AdvancedEventHandlingActivity extends AbstractPagesActivity {
- private int position;
-
- private List<Note> notes;
+ 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);
- setContentView(layout.notes_activity);
- getActionBar().setTitle("Advanced event handling");
- getActionBar().setDisplayHomeAsUpEnabled(true);
- findViewById(id.next).setOnClickListener(this);
- findViewById(id.previous).setOnClickListener(this);
- if (savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_POSITION)) {
- position = savedInstanceState.getInt(BUNDLE_POSITION);
- }
- notes = Arrays.asList(
- new Note("Overriding gestures", "Some gestures can be overridden with your own GestureDetector without affecting the image view. This allows you to get the coordinates of the event."),
- new Note("onSingleTapConfirmed", "onSingleTapConfirmed has been overridden. Tap the image to see coordinates."),
- new Note("onDoubleTap", "onDoubleTap has been overridden. Tap the image to see coordinates. This overrides the default zoom in behaviour."),
- new Note("onLongPress", "onLongPress has been overridden. Press and hold the image to see coordinates."),
- new Note("Other events", "You can override any event you want, but customising swipe, fling and zoom gestures will stop the view working normally.")
- );
-
- initialiseImage();
- updateNotes();
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putInt(BUNDLE_POSITION, position);
- }
-
- @Override
- public void onClick(View view) {
- if (view.getId() == id.next) {
- position++;
- updateNotes();
- } else if (view.getId() == id.previous) {
- position--;
- updateNotes();
- }
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- finish();
- return true;
- }
-
- private void initialiseImage() {
- final SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(id.imageView);
+ final SubsamplingScaleImageView imageView = findViewById(id.imageView);
final GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
@@ -125,7 +83,7 @@ public class AdvancedEventHandlingActivity extends Activity implements OnClickLi
});
imageView.setImage(ImageSource.asset("squirrel.jpg"));
- imageView.setOnTouchListener(new OnTouchListener() {
+ imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return gestureDetector.onTouchEvent(motionEvent);
@@ -133,23 +91,4 @@ public class AdvancedEventHandlingActivity extends Activity implements OnClickLi
});
}
- private void updateNotes() {
- if (position > notes.size() - 1) {
- return;
- }
- getActionBar().setSubtitle(notes.get(position).subtitle);
- ((TextView)findViewById(id.note)).setText(notes.get(position).text);
- findViewById(id.next).setVisibility(position >= notes.size() - 1 ? View.INVISIBLE : View.VISIBLE);
- findViewById(id.previous).setVisibility(position <= 0 ? View.INVISIBLE : View.VISIBLE);
- }
-
- private static final class Note {
- private final String text;
- private final String subtitle;
- private Note(String subtitle, String text) {
- this.subtitle = subtitle;
- this.text = text;
- }
- }
-
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionActivity.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionActivity.java
index 773d6af..1b143d7 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionActivity.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionActivity.java
@@ -16,88 +16,51 @@ limitations under the License.
package com.davemorrissey.labs.subscaleview.sample.extension;
-import android.os.Bundle;
import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentActivity;
import android.util.Log;
-import android.view.MenuItem;
-import android.widget.Toast;
+
+import com.davemorrissey.labs.subscaleview.sample.AbstractFragmentsActivity;
+import com.davemorrissey.labs.subscaleview.sample.Page;
import com.davemorrissey.labs.subscaleview.sample.R.id;
-import com.davemorrissey.labs.subscaleview.sample.R.layout;
+import com.davemorrissey.labs.subscaleview.sample.imagedisplay.ImageDisplayActivity;
import java.util.Arrays;
import java.util.List;
-public class ExtensionActivity extends FragmentActivity {
-
- private static final String BUNDLE_POSITION = "position";
-
- private int position;
-
- private List<Page> pages;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(layout.extension_activity);
- getActionBar().setTitle("Extension");
- getActionBar().setDisplayHomeAsUpEnabled(true);
- if (savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_POSITION)) {
- position = savedInstanceState.getInt(BUNDLE_POSITION);
- }
- pages = Arrays.asList(
- new Page("Location pin", ExtensionPinFragment.class),
- new Page("Overlaid circle", ExtensionCircleFragment.class),
- new Page("Freehand drawing", ExtensionFreehandFragment.class)
- );
-
- updatePage();
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putInt(BUNDLE_POSITION, position);
+import static com.davemorrissey.labs.subscaleview.sample.R.layout.fragments_activity;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.extension_p1_subtitle;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.extension_p1_text;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.extension_p2_subtitle;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.extension_p2_text;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.extension_p3_subtitle;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.extension_p3_text;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.extension_title;
+
+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
- public boolean onOptionsItemSelected(MenuItem item) {
- finish();
- return true;
- }
-
- public void next() {
- position++;
- updatePage();
- }
-
- public void previous() {
- position--;
- updatePage();
- }
-
- private void updatePage() {
- if (position > pages.size() - 1) {
- return;
- }
- getActionBar().setSubtitle(pages.get(position).subtitle);
+ protected void onPageChanged(int page) {
try {
getSupportFragmentManager()
.beginTransaction()
- .replace(id.frame, (Fragment)pages.get(position).clazz.newInstance())
+ .replace(id.frame, FRAGMENTS.get(page).newInstance())
.commit();
} catch (Exception e) {
- Log.e("something", "Failed to load fragment", e);
- Toast.makeText(this, "Whoops, couldn't load the fragment!", Toast.LENGTH_SHORT).show();
- }
- }
-
- private static final class Page {
- private final String subtitle;
- private final Class<?> clazz;
- private Page(String subtitle, Class<?> clazz) {
- this.subtitle = subtitle;
- this.clazz = clazz;
+ Log.e(ImageDisplayActivity.class.getName(), "Failed to load fragment", e);
}
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionCircleFragment.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionCircleFragment.java
index bc4dab2..3cb3866 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionCircleFragment.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionCircleFragment.java
@@ -20,7 +20,6 @@ import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.davemorrissey.labs.subscaleview.ImageSource;
@@ -33,19 +32,13 @@ public class ExtensionCircleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(layout.extension_circle_fragment, container, false);
- rootView.findViewById(id.next).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- ((ExtensionActivity)getActivity()).next();
- }
+ rootView.findViewById(id.next).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { ((ExtensionActivity) ExtensionCircleFragment.this.getActivity()).next(); }
});
- rootView.findViewById(id.previous).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- ((ExtensionActivity)getActivity()).previous();
- }
+ rootView.findViewById(id.previous).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { ((ExtensionActivity) ExtensionCircleFragment.this.getActivity()).previous(); }
});
- SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)rootView.findViewById(id.imageView);
+ SubsamplingScaleImageView imageView = rootView.findViewById(id.imageView);
imageView.setImage(ImageSource.asset("squirrel.jpg"));
return rootView;
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionFreehandFragment.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionFreehandFragment.java
index 0ba58c3..e77f882 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionFreehandFragment.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionFreehandFragment.java
@@ -20,7 +20,6 @@ import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.davemorrissey.labs.subscaleview.ImageSource;
@@ -33,19 +32,13 @@ public class ExtensionFreehandFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(layout.extension_freehand_fragment, container, false);
- rootView.findViewById(id.previous).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- ((ExtensionActivity)getActivity()).previous();
- }
+ rootView.findViewById(id.previous).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { ((ExtensionActivity) ExtensionFreehandFragment.this.getActivity()).previous(); }
});
- final FreehandView imageView = (FreehandView)rootView.findViewById(id.imageView);
+ final FreehandView imageView = rootView.findViewById(id.imageView);
imageView.setImage(ImageSource.asset("squirrel.jpg"));
- rootView.findViewById(id.reset).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- imageView.reset();
- }
+ rootView.findViewById(id.reset).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { imageView.reset(); }
});
return rootView;
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionPinFragment.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionPinFragment.java
index 50ca170..d8e4e71 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionPinFragment.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/ExtensionPinFragment.java
@@ -21,11 +21,9 @@ import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.davemorrissey.labs.subscaleview.ImageSource;
-import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import com.davemorrissey.labs.subscaleview.sample.R.id;
import com.davemorrissey.labs.subscaleview.sample.R.layout;
import com.davemorrissey.labs.subscaleview.sample.extension.views.PinView;
@@ -35,13 +33,10 @@ public class ExtensionPinFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(layout.extension_pin_fragment, container, false);
- rootView.findViewById(id.next).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- ((ExtensionActivity)getActivity()).next();
- }
+ rootView.findViewById(id.next).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { ((ExtensionActivity) ExtensionPinFragment.this.getActivity()).next(); }
});
- PinView imageView = (PinView)rootView.findViewById(id.imageView);
+ PinView imageView = rootView.findViewById(id.imageView);
imageView.setImage(ImageSource.asset("squirrel.jpg"));
imageView.setPin(new PointF(1718f, 581f));
return rootView;
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/CircleView.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/CircleView.java
index fffa292..9a7a6aa 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/CircleView.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/CircleView.java
@@ -27,6 +27,10 @@ public class CircleView extends SubsamplingScaleImageView {
private int strokeWidth;
+ private final PointF sCenter = new PointF();
+ private final PointF vCenter = new PointF();
+ private final Paint paint = new Paint();
+
public CircleView(Context context) {
this(context, null);
}
@@ -50,11 +54,10 @@ public class CircleView extends SubsamplingScaleImageView {
return;
}
- PointF sCenter = new PointF(getSWidth()/2, getSHeight()/2);
- PointF vCenter = sourceToViewCoord(sCenter);
+ sCenter.set(getSWidth()/2, getSHeight()/2);
+ sourceToViewCoord(sCenter, vCenter);
float radius = (getScale() * getSWidth()) * 0.25f;
- Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Style.STROKE);
paint.setStrokeCap(Cap.ROUND);
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/FreehandView.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/FreehandView.java
index 6de9f65..6d49aca 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/FreehandView.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/FreehandView.java
@@ -32,6 +32,10 @@ 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;
@@ -67,16 +71,15 @@ public class FreehandView extends SubsamplingScaleImageView implements OnTouchLi
}
boolean consumed = false;
int touchCount = event.getPointerCount();
- switch (event.getAction()) {
+ switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
- case MotionEvent.ACTION_POINTER_1_DOWN:
- vStart = new PointF(event.getX(), event.getY());
- vPrevious = new PointF(event.getX(), event.getY());
- break;
- case MotionEvent.ACTION_POINTER_2_DOWN:
- // Abort any current drawing, user is zooming
- vStart = null;
- vPrevious = null;
+ 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());
@@ -88,7 +91,7 @@ public class FreehandView extends SubsamplingScaleImageView implements OnTouchLi
float vDY = Math.abs(event.getY() - vPrevious.y);
if (vDX >= strokeWidth * 5 || vDY >= strokeWidth * 5) {
if (sPoints == null) {
- sPoints = new ArrayList<PointF>();
+ sPoints = new ArrayList<>();
sPoints.add(sStart);
}
sPoints.add(sCurrent);
@@ -123,15 +126,14 @@ public class FreehandView extends SubsamplingScaleImageView implements OnTouchLi
return;
}
- Paint paint = new Paint();
paint.setAntiAlias(true);
if (sPoints != null && sPoints.size() >= 2) {
- Path vPath = new Path();
- PointF vPrev = sourceToViewCoord(sPoints.get(0).x, sPoints.get(0).y);
+ 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++) {
- PointF vPoint = sourceToViewCoord(sPoints.get(i).x, sPoints.get(i).y);
+ 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;
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/PinView.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/PinView.java
index 274e164..fda8f73 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/PinView.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/PinView.java
@@ -25,6 +25,8 @@ import com.davemorrissey.labs.subscaleview.sample.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;
@@ -43,10 +45,6 @@ public class PinView extends SubsamplingScaleImageView {
invalidate();
}
- public PointF getPin() {
- return sPin;
- }
-
private void initialise() {
float density = getResources().getDisplayMetrics().densityDpi;
pin = BitmapFactory.decodeResource(this.getResources(), drawable.pushpin_blue);
@@ -64,11 +62,10 @@ public class PinView extends SubsamplingScaleImageView {
return;
}
- Paint paint = new Paint();
paint.setAntiAlias(true);
if (sPin != null && pin != null) {
- PointF vPin = sourceToViewCoord(sPin);
+ sourceToViewCoord(sPin, vPin);
float vX = vPin.x - (pin.getWidth()/2);
float vY = vPin.y - pin.getHeight();
canvas.drawBitmap(pin, vX, vY, paint);
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayActivity.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayActivity.java
index 79142fd..7d0df3b 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayActivity.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayActivity.java
@@ -16,88 +16,44 @@ limitations under the License.
package com.davemorrissey.labs.subscaleview.sample.imagedisplay;
-import android.os.Bundle;
import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentActivity;
import android.util.Log;
-import android.view.MenuItem;
-import android.widget.Toast;
+
+import com.davemorrissey.labs.subscaleview.sample.AbstractFragmentsActivity;
+import com.davemorrissey.labs.subscaleview.sample.Page;
import com.davemorrissey.labs.subscaleview.sample.R.id;
-import com.davemorrissey.labs.subscaleview.sample.R.layout;
import java.util.Arrays;
import java.util.List;
-public class ImageDisplayActivity extends FragmentActivity {
-
- private static final String BUNDLE_POSITION = "position";
-
- private int position;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.*;
+import static com.davemorrissey.labs.subscaleview.sample.R.layout.*;
- private List<Page> pages;
+public class ImageDisplayActivity extends AbstractFragmentsActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(layout.extension_activity);
- getActionBar().setTitle("Image display");
- getActionBar().setDisplayHomeAsUpEnabled(true);
- if (savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_POSITION)) {
- position = savedInstanceState.getInt(BUNDLE_POSITION);
- }
- pages = Arrays.asList(
- new Page("Large images", ImageDisplayLargeFragment.class),
- new Page("Rotation", ImageDisplayRotateFragment.class),
- new Page("Display region", ImageDisplayRegionFragment.class)
- );
+ private static final List<Class<? extends Fragment>> FRAGMENTS = Arrays.asList(
+ ImageDisplayLargeFragment.class,
+ ImageDisplayRotateFragment.class,
+ ImageDisplayRegionFragment.class
+ );
- updatePage();
+ 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 onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putInt(BUNDLE_POSITION, position);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- finish();
- return true;
- }
-
- public void next() {
- position++;
- updatePage();
- }
-
- public void previous() {
- position--;
- updatePage();
- }
-
- private void updatePage() {
- if (position > pages.size() - 1) {
- return;
- }
- getActionBar().setSubtitle(pages.get(position).subtitle);
+ protected void onPageChanged(int page) {
try {
getSupportFragmentManager()
.beginTransaction()
- .replace(id.frame, (Fragment)pages.get(position).clazz.newInstance())
+ .replace(id.frame, FRAGMENTS.get(page).newInstance())
.commit();
} catch (Exception e) {
- Log.e("something", "Failed to load fragment", e);
- Toast.makeText(this, "Whoops, couldn't load the fragment!", Toast.LENGTH_SHORT).show();
- }
- }
-
- private static final class Page {
- private final String subtitle;
- private final Class<?> clazz;
- private Page(String subtitle, Class<?> clazz) {
- this.subtitle = subtitle;
- this.clazz = clazz;
+ Log.e(ImageDisplayActivity.class.getName(), "Failed to load fragment", e);
}
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayLargeFragment.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayLargeFragment.java
index 12a57ca..7e8542f 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayLargeFragment.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayLargeFragment.java
@@ -20,7 +20,6 @@ import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.davemorrissey.labs.subscaleview.ImageSource;
@@ -33,13 +32,10 @@ public class ImageDisplayLargeFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(layout.imagedisplay_large_fragment, container, false);
- rootView.findViewById(id.next).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- ((ImageDisplayActivity)getActivity()).next();
- }
+ rootView.findViewById(id.next).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { ((ImageDisplayActivity) ImageDisplayLargeFragment.this.getActivity()).next(); }
});
- SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)rootView.findViewById(id.imageView);
+ SubsamplingScaleImageView imageView = rootView.findViewById(id.imageView);
imageView.setImage(ImageSource.asset("card.png"));
return rootView;
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayRegionFragment.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayRegionFragment.java
index 1e00e35..517948f 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayRegionFragment.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayRegionFragment.java
@@ -21,7 +21,6 @@ import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.davemorrissey.labs.subscaleview.ImageSource;
@@ -34,22 +33,15 @@ public class ImageDisplayRegionFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(layout.imagedisplay_region_fragment, container, false);
- final SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)rootView.findViewById(id.imageView);
+ final SubsamplingScaleImageView imageView = rootView.findViewById(id.imageView);
imageView.setOrientation(SubsamplingScaleImageView.ORIENTATION_90);
imageView.setImage(ImageSource.asset("card.png").region(new Rect(0, 0, 3778, 2834)));
- rootView.findViewById(id.previous).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- ((ImageDisplayActivity)getActivity()).previous();
- }
+ rootView.findViewById(id.previous).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { ((ImageDisplayActivity) ImageDisplayRegionFragment.this.getActivity()).previous(); }
});
- rootView.findViewById(id.rotate).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- imageView.setOrientation((imageView.getOrientation() + 90) % 360);
- }
+ rootView.findViewById(id.rotate).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { imageView.setOrientation((imageView.getOrientation() + 90) % 360); }
});
-
return rootView;
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayRotateFragment.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayRotateFragment.java
index 62406b2..1ec199a 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayRotateFragment.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/ImageDisplayRotateFragment.java
@@ -20,7 +20,6 @@ import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.davemorrissey.labs.subscaleview.ImageSource;
@@ -30,33 +29,21 @@ import com.davemorrissey.labs.subscaleview.sample.R.layout;
public class ImageDisplayRotateFragment extends Fragment {
-
-
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(layout.imagedisplay_rotate_fragment, container, false);
- final SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)rootView.findViewById(id.imageView);
- imageView.setImage(ImageSource.asset("squirrel.jpg"));
+ final SubsamplingScaleImageView imageView = rootView.findViewById(id.imageView);
+ imageView.setImage(ImageSource.asset("eagle.jpg"));
imageView.setOrientation(90);
- rootView.findViewById(id.previous).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- ((ImageDisplayActivity)getActivity()).previous();
- }
+ rootView.findViewById(id.previous).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { ((ImageDisplayActivity) ImageDisplayRotateFragment.this.getActivity()).previous(); }
});
- rootView.findViewById(id.next).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- ((ImageDisplayActivity)getActivity()).next();
- }
+ rootView.findViewById(id.next).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { ((ImageDisplayActivity) ImageDisplayRotateFragment.this.getActivity()).next(); }
});
- rootView.findViewById(id.rotate).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- imageView.setOrientation((imageView.getOrientation() + 90) % 360);
- }
+ rootView.findViewById(id.rotate).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { imageView.setOrientation((imageView.getOrientation() + 90) % 360); }
});
-
return rootView;
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/decoders/RapidImageDecoder.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/decoders/RapidImageDecoder.java
deleted file mode 100644
index e599b44..0000000
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/decoders/RapidImageDecoder.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.davemorrissey.labs.subscaleview.sample.imagedisplay.decoders;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.net.Uri;
-
-import com.davemorrissey.labs.subscaleview.decoder.ImageDecoder;
-
-import rapid.decoder.BitmapDecoder;
-
-/**
- * A very simple implementation of {@link com.davemorrissey.labs.subscaleview.decoder.ImageRegionDecoder}
- * using the RapidDecoder library (https://github.com/suckgamony/RapidDecoder). For PNGs, this can
- * give more reliable decoding and better performance. For JPGs, it is slower and can run out of
- * memory with large images, but has better support for grayscale and CMYK images.
- *
- * This is an incomplete and untested implementation provided as an example only.
- */
-public class RapidImageDecoder implements ImageDecoder {
-
- @Override
- public Bitmap decode(Context context, Uri uri) throws Exception {
- return BitmapDecoder.from(context, uri).useBuiltInDecoder(true).config(Bitmap.Config.RGB_565).decode();
- }
-
-}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/decoders/RapidImageRegionDecoder.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/decoders/RapidImageRegionDecoder.java
deleted file mode 100644
index b8cb0d1..0000000
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/imagedisplay/decoders/RapidImageRegionDecoder.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.davemorrissey.labs.subscaleview.sample.imagedisplay.decoders;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.net.Uri;
-
-import com.davemorrissey.labs.subscaleview.decoder.ImageRegionDecoder;
-
-import rapid.decoder.BitmapDecoder;
-
-/**
- * A very simple implementation of {@link com.davemorrissey.labs.subscaleview.decoder.ImageRegionDecoder}
- * using the RapidDecoder library (https://github.com/suckgamony/RapidDecoder). For PNGs, this can
- * give more reliable decoding and better performance. For JPGs, it is slower and can run out of
- * memory with large images, but has better support for grayscale and CMYK images.
- *
- * This is an incomplete and untested implementation provided as an example only.
- */
-public class RapidImageRegionDecoder implements ImageRegionDecoder {
-
- private BitmapDecoder decoder;
-
- @Override
- public Point init(Context context, Uri uri) throws Exception {
- decoder = BitmapDecoder.from(context, uri);
- decoder.useBuiltInDecoder(true);
- return new Point(decoder.sourceWidth(), decoder.sourceHeight());
- }
-
- @Override
- public synchronized Bitmap decodeRegion(Rect sRect, int sampleSize) {
- try {
- return decoder.reset().region(sRect).scale(sRect.width()/sampleSize, sRect.height()/sampleSize).decode();
- } catch (Exception e) {
- return null;
- }
- }
-
- @Override
- public boolean isReady() {
- return decoder != null;
- }
-
- @Override
- public void recycle() {
- BitmapDecoder.destroyMemoryCache();
- BitmapDecoder.destroyDiskCache();
- decoder.reset();
- decoder = null;
- }
-}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/viewpager/ViewPagerActivity.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/viewpager/ViewPagerActivity.java
index 71ccdbb..ba7fb7f 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/viewpager/ViewPagerActivity.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/viewpager/ViewPagerActivity.java
@@ -18,81 +18,47 @@ package com.davemorrissey.labs.subscaleview.sample.viewpager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
-import android.view.MenuItem;
import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.TextView;
-import android.widget.Toast;
+import com.davemorrissey.labs.subscaleview.sample.AbstractPagesActivity;
+import com.davemorrissey.labs.subscaleview.sample.Page;
import com.davemorrissey.labs.subscaleview.sample.R;
-import com.davemorrissey.labs.subscaleview.sample.R.layout;
import java.util.Arrays;
-import java.util.List;
-public class ViewPagerActivity extends FragmentActivity implements OnClickListener {
+import static com.davemorrissey.labs.subscaleview.sample.R.layout.view_pager;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.pager_p1_subtitle;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.pager_p1_text;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.pager_p2_subtitle;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.pager_p2_text;
+import static com.davemorrissey.labs.subscaleview.sample.R.string.pager_title;
- private static final String[] IMAGES = { "ness.jpg", "squirrel.jpg" };
+public class ViewPagerActivity extends AbstractPagesActivity {
- private static final String BUNDLE_POSITION = "position";
+ private static final String[] IMAGES = { "eagle.jpg", "pony.jpg" };
- private int position;
-
- private List<Note> notes;
+ public ViewPagerActivity() {
+ super(pager_title, view_pager, Arrays.asList(
+ new Page(pager_p1_subtitle, pager_p1_text),
+ new Page(pager_p2_subtitle, pager_p2_text)
+ ));
+ }
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(layout.view_pager);
- getActionBar().setTitle("View pager gallery");
- getActionBar().setDisplayHomeAsUpEnabled(true);
- findViewById(R.id.next).setOnClickListener(this);
- findViewById(R.id.previous).setOnClickListener(this);
- if (savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_POSITION)) {
- position = savedInstanceState.getInt(BUNDLE_POSITION);
- }
- notes = Arrays.asList(
- new Note("Horizontal", "This gallery has two images in a ViewPager. Swipe to move to the next image. If you're zoomed in on an image, you need to pan to the right of it, then swipe again to activate the pager."),
- new Note("Vertical", "Vertical view pagers are also supported. Swipe up to move to the next image. If you're zoomed in on an image, you need to pan to the bottom of it, then swipe again to activate the pager.")
- );
-
- updateNotes();
-
- ViewPager horizontalPager = (ViewPager)findViewById(R.id.horizontal_pager);
+ ViewPager horizontalPager = findViewById(R.id.horizontal_pager);
horizontalPager.setAdapter(new ScreenSlidePagerAdapter(getSupportFragmentManager()));
- ViewPager verticalPager = (ViewPager)findViewById(R.id.vertical_pager);
+ ViewPager verticalPager = findViewById(R.id.vertical_pager);
verticalPager.setAdapter(new ScreenSlidePagerAdapter(getSupportFragmentManager()));
}
@Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putInt(BUNDLE_POSITION, position);
- }
-
- @Override
- public void onClick(View view) {
- if (view.getId() == R.id.next) {
- position++;
- updateNotes();
- } else if (view.getId() == R.id.previous) {
- position--;
- updateNotes();
- } else if (view.getId() == R.id.imageView) {
- Toast.makeText(this, "Clicked", Toast.LENGTH_SHORT).show();
- }
- }
-
- @Override
public void onBackPressed() {
- ViewPager viewPager = (ViewPager)findViewById(R.id.horizontal_pager);
- if (position == 1) {
- viewPager = (ViewPager)findViewById(R.id.vertical_pager);
- }
+ ViewPager viewPager = findViewById(getPage() == 0 ? R.id.horizontal_pager : R.id.vertical_pager);
if (viewPager.getCurrentItem() == 0) {
super.onBackPressed();
} else {
@@ -101,13 +67,18 @@ public class ViewPagerActivity extends FragmentActivity implements OnClickListen
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
- finish();
- return true;
+ protected void onPageChanged(int page) {
+ if (getPage() == 0) {
+ findViewById(R.id.horizontal_pager).setVisibility(View.VISIBLE);
+ findViewById(R.id.vertical_pager).setVisibility(View.GONE);
+ } else {
+ findViewById(R.id.horizontal_pager).setVisibility(View.GONE);
+ findViewById(R.id.vertical_pager).setVisibility(View.VISIBLE);
+ }
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
- public ScreenSlidePagerAdapter(FragmentManager fm) {
+ ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@@ -124,30 +95,4 @@ public class ViewPagerActivity extends FragmentActivity implements OnClickListen
}
}
- private void updateNotes() {
- if (position > notes.size() - 1) {
- return;
- }
- if (position == 0) {
- findViewById(R.id.horizontal_pager).setVisibility(View.VISIBLE);
- findViewById(R.id.vertical_pager).setVisibility(View.GONE);
- } else {
- findViewById(R.id.horizontal_pager).setVisibility(View.GONE);
- findViewById(R.id.vertical_pager).setVisibility(View.VISIBLE);
- }
- getActionBar().setSubtitle(notes.get(position).subtitle);
- ((TextView)findViewById(R.id.note)).setText(notes.get(position).text);
- findViewById(R.id.next).setVisibility(position >= notes.size() - 1 ? View.INVISIBLE : View.VISIBLE);
- findViewById(R.id.previous).setVisibility(position <= 0 ? View.INVISIBLE : View.VISIBLE);
- }
-
- private static final class Note {
- private final String text;
- private final String subtitle;
- private Note(String subtitle, String text) {
- this.subtitle = subtitle;
- this.text = text;
- }
- }
-
}
diff --git a/sample/src/com/davemorrissey/labs/subscaleview/sample/viewpager/ViewPagerFragment.java b/sample/src/com/davemorrissey/labs/subscaleview/sample/viewpager/ViewPagerFragment.java
index 7392185..442c84b 100644
--- a/sample/src/com/davemorrissey/labs/subscaleview/sample/viewpager/ViewPagerFragment.java
+++ b/sample/src/com/davemorrissey/labs/subscaleview/sample/viewpager/ViewPagerFragment.java
@@ -50,7 +50,7 @@ public class ViewPagerFragment extends Fragment {
}
}
if (asset != null) {
- SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)rootView.findViewById(id.imageView);
+ SubsamplingScaleImageView imageView = rootView.findViewById(id.imageView);
imageView.setImage(ImageSource.asset(asset));
}