aboutsummaryrefslogtreecommitdiff
path: root/sample/src/main/java/com/davemorrissey/labs/subscaleview/test
diff options
context:
space:
mode:
Diffstat (limited to 'sample/src/main/java/com/davemorrissey/labs/subscaleview/test')
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/AbstractFragmentsActivity.java98
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/AbstractPagesActivity.java115
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/MainActivity.java95
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/Page.java37
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/animation/AnimationActivity.java87
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/basicfeatures/BasicFeaturesActivity.java52
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/configuration/ConfigurationActivity.java110
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/eventhandling/EventHandlingActivity.java57
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/eventhandlingadvanced/AdvancedEventHandlingActivity.java94
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionActivity.java67
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionCircleFragment.java46
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionFreehandFragment.java46
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionPinFragment.java45
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/views/CircleView.java72
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/views/FreehandView.java157
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/views/PinView.java76
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayActivity.java60
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayLargeFragment.java43
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayRegionFragment.java48
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayRotateFragment.java50
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/viewpager/VerticalViewPager.java67
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/viewpager/ViewPagerActivity.java98
-rw-r--r--sample/src/main/java/com/davemorrissey/labs/subscaleview/test/viewpager/ViewPagerFragment.java69
23 files changed, 1689 insertions, 0 deletions
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/AbstractFragmentsActivity.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/AbstractFragmentsActivity.java
new file mode 100644
index 0000000..1694d2a
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/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.test;
+
+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/main/java/com/davemorrissey/labs/subscaleview/test/AbstractPagesActivity.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/AbstractPagesActivity.java
new file mode 100644
index 0000000..f8de39a
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/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.test;
+
+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/main/java/com/davemorrissey/labs/subscaleview/test/MainActivity.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/MainActivity.java
new file mode 100644
index 0000000..28e9089
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/MainActivity.java
@@ -0,0 +1,95 @@
+/*
+Copyright 2014 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.test;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.View;
+
+import com.davemorrissey.labs.subscaleview.test.R.id;
+import com.davemorrissey.labs.subscaleview.test.animation.AnimationActivity;
+import com.davemorrissey.labs.subscaleview.test.basicfeatures.BasicFeaturesActivity;
+import com.davemorrissey.labs.subscaleview.test.configuration.ConfigurationActivity;
+import com.davemorrissey.labs.subscaleview.test.eventhandling.EventHandlingActivity;
+import com.davemorrissey.labs.subscaleview.test.eventhandlingadvanced.AdvancedEventHandlingActivity;
+import com.davemorrissey.labs.subscaleview.test.extension.ExtensionActivity;
+import com.davemorrissey.labs.subscaleview.test.imagedisplay.ImageDisplayActivity;
+import com.davemorrissey.labs.subscaleview.test.viewpager.ViewPagerActivity;
+
+public class MainActivity extends Activity implements View.OnClickListener {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ actionBar.setTitle(R.string.main_title);
+ }
+ setContentView(R.layout.main);
+ findViewById(id.basicFeatures).setOnClickListener(this);
+ findViewById(id.imageDisplay).setOnClickListener(this);
+ findViewById(id.eventHandling).setOnClickListener(this);
+ findViewById(id.advancedEventHandling).setOnClickListener(this);
+ findViewById(id.viewPagerGalleries).setOnClickListener(this);
+ findViewById(id.animation).setOnClickListener(this);
+ findViewById(id.extension).setOnClickListener(this);
+ findViewById(id.configuration).setOnClickListener(this);
+ findViewById(id.github).setOnClickListener(this);
+ findViewById(id.self).setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case id.basicFeatures: startActivity(BasicFeaturesActivity.class); break;
+ case id.imageDisplay: startActivity(ImageDisplayActivity.class); break;
+ case id.eventHandling: startActivity(EventHandlingActivity.class); break;
+ case id.advancedEventHandling: startActivity(AdvancedEventHandlingActivity.class); break;
+ case id.viewPagerGalleries: startActivity(ViewPagerActivity.class); break;
+ case id.animation: startActivity(AnimationActivity.class); break;
+ case id.extension: startActivity(ExtensionActivity.class); break;
+ case id.configuration: startActivity(ConfigurationActivity.class); break;
+ case id.github: openGitHub(); break;
+ 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
+ public void onBackPressed() {
+ moveTaskToBack(true);
+ }
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/Page.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/Page.java
new file mode 100644
index 0000000..2582334
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/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.test;
+
+public class Page {
+
+ private final int text;
+
+ private final int subtitle;
+
+ public Page(int subtitle, int text) {
+ this.subtitle = subtitle;
+ this.text = text;
+ }
+
+ public int getText() {
+ return text;
+ }
+
+ public int getSubtitle() {
+ return subtitle;
+ }
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/animation/AnimationActivity.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/animation/AnimationActivity.java
new file mode 100644
index 0000000..31cd2fd
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/animation/AnimationActivity.java
@@ -0,0 +1,87 @@
+/*
+Copyright 2014 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.test.animation;
+
+import android.graphics.PointF;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.View;
+
+import com.davemorrissey.labs.subscaleview.ImageSource;
+import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView.AnimationBuilder;
+import com.davemorrissey.labs.subscaleview.test.AbstractPagesActivity;
+import com.davemorrissey.labs.subscaleview.test.Page;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+import com.davemorrissey.labs.subscaleview.test.extension.views.PinView;
+
+import java.util.Arrays;
+import java.util.Random;
+
+import static com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView.*;
+import static com.davemorrissey.labs.subscaleview.test.R.string.*;
+import static com.davemorrissey.labs.subscaleview.test.R.layout.*;
+
+public class AnimationActivity extends AbstractPagesActivity {
+
+ private PinView view;
+
+ public AnimationActivity() {
+ super(animation_title, animation_activity, Arrays.asList(
+ new Page(animation_p1_subtitle, animation_p1_text),
+ new Page(animation_p2_subtitle, animation_p2_text),
+ new Page(animation_p3_subtitle, animation_p3_text),
+ new Page(animation_p4_subtitle, animation_p4_text)
+ ));
+ }
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ findViewById(id.play).setOnClickListener(new OnClickListener() {
+ @Override public void onClick(View v) { AnimationActivity.this.play(); }
+ });
+ view = findViewById(id.imageView);
+ view.setImage(ImageSource.asset("squirrel.jpg"));
+ }
+
+ @Override
+ protected void onPageChanged(int page) {
+ if (page == 2) {
+ view.setPanLimit(PAN_LIMIT_CENTER);
+ } else {
+ view.setPanLimit(PAN_LIMIT_INSIDE);
+ }
+ }
+
+ private void play() {
+ Random random = new Random();
+ if (view.isReady()) {
+ float maxScale = view.getMaxScale();
+ float minScale = view.getMinScale();
+ float scale = (random.nextFloat() * (maxScale - minScale)) + minScale;
+ PointF center = new PointF(random.nextInt(view.getSWidth()), random.nextInt(view.getSHeight()));
+ view.setPin(center);
+ AnimationBuilder animationBuilder = view.animateScaleAndCenter(scale, center);
+ if (getPage() == 3) {
+ animationBuilder.withDuration(2000).withEasing(EASE_OUT_QUAD).withInterruptible(false).start();
+ } else {
+ animationBuilder.withDuration(750).start();
+ }
+ }
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/basicfeatures/BasicFeaturesActivity.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/basicfeatures/BasicFeaturesActivity.java
new file mode 100644
index 0000000..654ca02
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/basicfeatures/BasicFeaturesActivity.java
@@ -0,0 +1,52 @@
+/*
+Copyright 2014 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.test.basicfeatures;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+
+import com.davemorrissey.labs.subscaleview.ImageSource;
+import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.test.AbstractPagesActivity;
+import com.davemorrissey.labs.subscaleview.test.Page;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+
+import java.util.Arrays;
+
+import static com.davemorrissey.labs.subscaleview.test.R.string.*;
+import static com.davemorrissey.labs.subscaleview.test.R.layout.*;
+
+public class BasicFeaturesActivity extends AbstractPagesActivity {
+
+ public BasicFeaturesActivity() {
+ super(basic_title, pages_activity, Arrays.asList(
+ new Page(basic_p1_subtitle, basic_p1_text),
+ new Page(basic_p2_subtitle, basic_p2_text),
+ new Page(basic_p3_subtitle, basic_p3_text),
+ new Page(basic_p4_subtitle, basic_p4_text),
+ new Page(basic_p5_subtitle, basic_p5_text)
+ ));
+ }
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ SubsamplingScaleImageView view = findViewById(id.imageView);
+ view.setImage(ImageSource.asset("pony.jpg"));
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/configuration/ConfigurationActivity.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/configuration/ConfigurationActivity.java
new file mode 100644
index 0000000..1f81295
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/configuration/ConfigurationActivity.java
@@ -0,0 +1,110 @@
+/*
+Copyright 2014 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.test.configuration;
+
+import android.graphics.PointF;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+
+import com.davemorrissey.labs.subscaleview.ImageSource;
+import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.test.AbstractPagesActivity;
+import com.davemorrissey.labs.subscaleview.test.Page;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+
+import java.util.Arrays;
+
+import static com.davemorrissey.labs.subscaleview.test.R.string.*;
+import static com.davemorrissey.labs.subscaleview.test.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
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ view = findViewById(id.imageView);
+ view.setImage(ImageSource.asset("eagle.jpg"));
+ }
+
+ @Override
+ protected void onPageChanged(int page) {
+ if (page == 0) {
+ view.setMinimumDpi(50);
+ } else {
+ view.setMaxScale(2F);
+ }
+ if (page == 1) {
+ view.setMinimumTileDpi(50);
+ } else {
+ view.setMinimumTileDpi(500);
+ }
+ if (page == 4) {
+ view.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER);
+ } else if (page == 5) {
+ view.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER_IMMEDIATE);
+ } else {
+ view.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_FIXED);
+ }
+ if (page == 6) {
+ view.setDoubleTapZoomDpi(240);
+ } else {
+ view.setDoubleTapZoomScale(1F);
+ }
+ if (page == 7) {
+ view.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_CENTER);
+ } else if (page == 8) {
+ view.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_OUTSIDE);
+ } else {
+ view.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_INSIDE);
+ }
+ if (page == 9) {
+ view.setDebug(true);
+ } else {
+ view.setDebug(false);
+ }
+ if (page == 2) {
+ view.setScaleAndCenter(0f, new PointF(2456, 1632));
+ view.setPanEnabled(false);
+ } else {
+ view.setPanEnabled(true);
+ }
+ if (page == 3) {
+ view.setScaleAndCenter(1f, new PointF(2456, 1632));
+ view.setZoomEnabled(false);
+ } else {
+ view.setZoomEnabled(true);
+ }
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/eventhandling/EventHandlingActivity.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/eventhandling/EventHandlingActivity.java
new file mode 100644
index 0000000..dac6f08
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/eventhandling/EventHandlingActivity.java
@@ -0,0 +1,57 @@
+/*
+Copyright 2014 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.test.eventhandling;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Toast;
+
+import com.davemorrissey.labs.subscaleview.ImageSource;
+import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.test.AbstractPagesActivity;
+import com.davemorrissey.labs.subscaleview.test.Page;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+
+import java.util.Arrays;
+
+import static com.davemorrissey.labs.subscaleview.test.R.layout.*;
+import static com.davemorrissey.labs.subscaleview.test.R.string.*;
+
+public class EventHandlingActivity extends AbstractPagesActivity {
+
+ public EventHandlingActivity() {
+ super(event_title, pages_activity, Arrays.asList(
+ new Page(event_p1_subtitle, event_p1_text),
+ new Page(event_p2_subtitle, event_p2_text),
+ new Page(event_p3_subtitle, event_p3_text)
+ ));
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ SubsamplingScaleImageView imageView = findViewById(id.imageView);
+ imageView.setImage(ImageSource.asset("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/main/java/com/davemorrissey/labs/subscaleview/test/eventhandlingadvanced/AdvancedEventHandlingActivity.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/eventhandlingadvanced/AdvancedEventHandlingActivity.java
new file mode 100644
index 0000000..1e65f1f
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/eventhandlingadvanced/AdvancedEventHandlingActivity.java
@@ -0,0 +1,94 @@
+/*
+Copyright 2014 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.test.eventhandlingadvanced;
+
+import android.graphics.PointF;
+import android.os.Bundle;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.Toast;
+
+import com.davemorrissey.labs.subscaleview.ImageSource;
+import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.test.AbstractPagesActivity;
+import com.davemorrissey.labs.subscaleview.test.Page;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+
+import java.util.Arrays;
+
+import static com.davemorrissey.labs.subscaleview.test.R.string.*;
+import static com.davemorrissey.labs.subscaleview.test.R.layout.*;
+
+public class AdvancedEventHandlingActivity extends AbstractPagesActivity {
+
+ public AdvancedEventHandlingActivity() {
+ super(advancedevent_title, pages_activity, Arrays.asList(
+ new Page(advancedevent_p1_subtitle, advancedevent_p1_text),
+ new Page(advancedevent_p2_subtitle, advancedevent_p2_text),
+ new Page(advancedevent_p3_subtitle, advancedevent_p3_text),
+ new Page(advancedevent_p4_subtitle, advancedevent_p4_text),
+ new Page(advancedevent_p5_subtitle, advancedevent_p5_text)
+ ));
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ final SubsamplingScaleImageView imageView = findViewById(id.imageView);
+ final GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
+ @Override
+ public boolean onSingleTapConfirmed(MotionEvent e) {
+ if (imageView.isReady()) {
+ PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY());
+ Toast.makeText(getApplicationContext(), "Single tap: " + ((int)sCoord.x) + ", " + ((int)sCoord.y), Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(getApplicationContext(), "Single tap: Image not ready", Toast.LENGTH_SHORT).show();
+ }
+ return true;
+ }
+ @Override
+ public void onLongPress(MotionEvent e) {
+ if (imageView.isReady()) {
+ PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY());
+ Toast.makeText(getApplicationContext(), "Long press: " + ((int)sCoord.x) + ", " + ((int)sCoord.y), Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(getApplicationContext(), "Long press: Image not ready", Toast.LENGTH_SHORT).show();
+ }
+ }
+ @Override
+ public boolean onDoubleTap(MotionEvent e) {
+ if (imageView.isReady()) {
+ PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY());
+ Toast.makeText(getApplicationContext(), "Double tap: " + ((int)sCoord.x) + ", " + ((int)sCoord.y), Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(getApplicationContext(), "Double tap: Image not ready", Toast.LENGTH_SHORT).show();
+ }
+ return true;
+ }
+ });
+
+ imageView.setImage(ImageSource.asset("squirrel.jpg"));
+ imageView.setOnTouchListener(new View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View view, MotionEvent motionEvent) {
+ return gestureDetector.onTouchEvent(motionEvent);
+ }
+ });
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionActivity.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionActivity.java
new file mode 100644
index 0000000..b767a42
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionActivity.java
@@ -0,0 +1,67 @@
+/*
+Copyright 2014 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.test.extension;
+
+import android.support.v4.app.Fragment;
+import android.util.Log;
+
+import com.davemorrissey.labs.subscaleview.test.AbstractFragmentsActivity;
+import com.davemorrissey.labs.subscaleview.test.Page;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+import com.davemorrissey.labs.subscaleview.test.imagedisplay.ImageDisplayActivity;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static com.davemorrissey.labs.subscaleview.test.R.layout.fragments_activity;
+import static com.davemorrissey.labs.subscaleview.test.R.string.extension_p1_subtitle;
+import static com.davemorrissey.labs.subscaleview.test.R.string.extension_p1_text;
+import static com.davemorrissey.labs.subscaleview.test.R.string.extension_p2_subtitle;
+import static com.davemorrissey.labs.subscaleview.test.R.string.extension_p2_text;
+import static com.davemorrissey.labs.subscaleview.test.R.string.extension_p3_subtitle;
+import static com.davemorrissey.labs.subscaleview.test.R.string.extension_p3_text;
+import static com.davemorrissey.labs.subscaleview.test.R.string.extension_title;
+
+public class ExtensionActivity extends AbstractFragmentsActivity {
+
+ private static final List<Class<? extends Fragment>> FRAGMENTS = Arrays.asList(
+ ExtensionPinFragment.class,
+ ExtensionCircleFragment.class,
+ ExtensionFreehandFragment.class
+ );
+
+ public ExtensionActivity() {
+ super(extension_title, fragments_activity, Arrays.asList(
+ new Page(extension_p1_subtitle, extension_p1_text),
+ new Page(extension_p2_subtitle, extension_p2_text),
+ new Page(extension_p3_subtitle, extension_p3_text)
+ ));
+ }
+
+ @Override
+ protected void onPageChanged(int page) {
+ try {
+ getSupportFragmentManager()
+ .beginTransaction()
+ .replace(id.frame, FRAGMENTS.get(page).newInstance())
+ .commit();
+ } catch (Exception e) {
+ Log.e(ImageDisplayActivity.class.getName(), "Failed to load fragment", e);
+ }
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionCircleFragment.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionCircleFragment.java
new file mode 100644
index 0000000..e448e7a
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionCircleFragment.java
@@ -0,0 +1,46 @@
+/*
+Copyright 2014 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.test.extension;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.davemorrissey.labs.subscaleview.ImageSource;
+import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+import com.davemorrissey.labs.subscaleview.test.R.layout;
+
+public class ExtensionCircleFragment extends Fragment {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View rootView = inflater.inflate(layout.extension_circle_fragment, container, false);
+ 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 View.OnClickListener() {
+ @Override public void onClick(View v) { ((ExtensionActivity) ExtensionCircleFragment.this.getActivity()).previous(); }
+ });
+ SubsamplingScaleImageView imageView = rootView.findViewById(id.imageView);
+ imageView.setImage(ImageSource.asset("squirrel.jpg"));
+ return rootView;
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionFreehandFragment.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionFreehandFragment.java
new file mode 100644
index 0000000..4d2c5c5
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionFreehandFragment.java
@@ -0,0 +1,46 @@
+/*
+Copyright 2014 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.test.extension;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.davemorrissey.labs.subscaleview.ImageSource;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+import com.davemorrissey.labs.subscaleview.test.R.layout;
+import com.davemorrissey.labs.subscaleview.test.extension.views.FreehandView;
+
+public class ExtensionFreehandFragment extends Fragment {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View rootView = inflater.inflate(layout.extension_freehand_fragment, container, false);
+ rootView.findViewById(id.previous).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { ((ExtensionActivity) ExtensionFreehandFragment.this.getActivity()).previous(); }
+ });
+ final FreehandView imageView = rootView.findViewById(id.imageView);
+ imageView.setImage(ImageSource.asset("squirrel.jpg"));
+ rootView.findViewById(id.reset).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { imageView.reset(); }
+ });
+ return rootView;
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionPinFragment.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionPinFragment.java
new file mode 100644
index 0000000..4dd4c4f
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/ExtensionPinFragment.java
@@ -0,0 +1,45 @@
+/*
+Copyright 2014 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.test.extension;
+
+import android.graphics.PointF;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.davemorrissey.labs.subscaleview.ImageSource;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+import com.davemorrissey.labs.subscaleview.test.R.layout;
+import com.davemorrissey.labs.subscaleview.test.extension.views.PinView;
+
+public class ExtensionPinFragment extends Fragment {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View rootView = inflater.inflate(layout.extension_pin_fragment, container, false);
+ rootView.findViewById(id.next).setOnClickListener(new View.OnClickListener() {
+ @Override public void onClick(View v) { ((ExtensionActivity) ExtensionPinFragment.this.getActivity()).next(); }
+ });
+ 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/main/java/com/davemorrissey/labs/subscaleview/test/extension/views/CircleView.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/views/CircleView.java
new file mode 100644
index 0000000..f3045f0
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/views/CircleView.java
@@ -0,0 +1,72 @@
+/*
+Copyright 2014 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.test.extension.views;
+
+import android.content.Context;
+import android.graphics.*;
+import android.graphics.Paint.Cap;
+import android.graphics.Paint.Style;
+import android.util.AttributeSet;
+import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+
+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);
+ }
+
+ public CircleView(Context context, AttributeSet attr) {
+ super(context, attr);
+ initialise();
+ }
+
+ private void initialise() {
+ float density = getResources().getDisplayMetrics().densityDpi;
+ strokeWidth = (int)(density/60f);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ // Don't draw pin before image is ready so it doesn't move around during setup.
+ if (!isReady()) {
+ return;
+ }
+
+ sCenter.set(getSWidth()/2, getSHeight()/2);
+ sourceToViewCoord(sCenter, vCenter);
+ float radius = (getScale() * getSWidth()) * 0.25f;
+
+ paint.setAntiAlias(true);
+ paint.setStyle(Style.STROKE);
+ paint.setStrokeCap(Cap.ROUND);
+ paint.setStrokeWidth(strokeWidth * 2);
+ paint.setColor(Color.BLACK);
+ canvas.drawCircle(vCenter.x, vCenter.y, radius, paint);
+ paint.setStrokeWidth(strokeWidth);
+ paint.setColor(Color.argb(255, 51, 181, 229));
+ canvas.drawCircle(vCenter.x, vCenter.y, radius, paint);
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/views/FreehandView.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/views/FreehandView.java
new file mode 100644
index 0000000..c815749
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/views/FreehandView.java
@@ -0,0 +1,157 @@
+/*
+Copyright 2014 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.test.extension.views;
+
+import android.content.Context;
+import android.graphics.*;
+import android.graphics.Paint.Cap;
+import android.graphics.Paint.Style;
+import android.support.annotation.NonNull;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnTouchListener;
+import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class FreehandView extends SubsamplingScaleImageView implements OnTouchListener {
+
+ private final Paint paint = new Paint();
+ private final Path vPath = new Path();
+ private final PointF vPoint = new PointF();
+ private PointF vPrev = new PointF();
+ private PointF vPrevious;
+ private PointF vStart;
+ private boolean drawing = false;
+
+ private int strokeWidth;
+
+ private List<PointF> sPoints;
+
+ public FreehandView(Context context, AttributeSet attr) {
+ super(context, attr);
+ initialise();
+ }
+
+ public FreehandView(Context context) {
+ this(context, null);
+ }
+
+ private void initialise() {
+ setOnTouchListener(this);
+ float density = getResources().getDisplayMetrics().densityDpi;
+ strokeWidth = (int)(density/60f);
+ }
+
+ @Override
+ public boolean onTouch(View view, MotionEvent motionEvent) {
+ return false;
+ }
+
+ @Override
+ public boolean onTouchEvent(@NonNull MotionEvent event) {
+ if (sPoints != null && !drawing) {
+ return super.onTouchEvent(event);
+ }
+ boolean consumed = false;
+ int touchCount = event.getPointerCount();
+ switch (event.getActionMasked()) {
+ case MotionEvent.ACTION_DOWN:
+ if (event.getActionIndex() == 0) {
+ vStart = new PointF(event.getX(), event.getY());
+ vPrevious = new PointF(event.getX(), event.getY());
+ } else {
+ vStart = null;
+ vPrevious = null;
+ }
+ break;
+ case MotionEvent.ACTION_MOVE:
+ PointF sCurrentF = viewToSourceCoord(event.getX(), event.getY());
+ PointF sCurrent = new PointF(sCurrentF.x, sCurrentF.y);
+ PointF sStart = vStart == null ? null : new PointF(viewToSourceCoord(vStart).x, viewToSourceCoord(vStart).y);
+
+ if (touchCount == 1 && vStart != null) {
+ float vDX = Math.abs(event.getX() - vPrevious.x);
+ float vDY = Math.abs(event.getY() - vPrevious.y);
+ if (vDX >= strokeWidth * 5 || vDY >= strokeWidth * 5) {
+ if (sPoints == null) {
+ sPoints = new ArrayList<>();
+ sPoints.add(sStart);
+ }
+ sPoints.add(sCurrent);
+ vPrevious.x = event.getX();
+ vPrevious.y = event.getY();
+ drawing = true;
+ }
+ consumed = true;
+ invalidate();
+ } else if (touchCount == 1) {
+ // Consume all one touch drags to prevent odd panning effects handled by the superclass.
+ consumed = true;
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_POINTER_UP:
+ invalidate();
+ drawing = false;
+ vPrevious = null;
+ vStart = null;
+ }
+ // Use parent to handle pinch and two-finger pan.
+ return consumed || super.onTouchEvent(event);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ // Don't draw anything before image is ready.
+ if (!isReady()) {
+ return;
+ }
+
+ paint.setAntiAlias(true);
+
+ if (sPoints != null && sPoints.size() >= 2) {
+ vPath.reset();
+ sourceToViewCoord(sPoints.get(0).x, sPoints.get(0).y, vPrev);
+ vPath.moveTo(vPrev.x, vPrev.y);
+ for (int i = 1; i < sPoints.size(); i++) {
+ sourceToViewCoord(sPoints.get(i).x, sPoints.get(i).y, vPoint);
+ vPath.quadTo(vPrev.x, vPrev.y, (vPoint.x + vPrev.x) / 2, (vPoint.y + vPrev.y) / 2);
+ vPrev = vPoint;
+ }
+ paint.setStyle(Style.STROKE);
+ paint.setStrokeCap(Cap.ROUND);
+ paint.setStrokeWidth(strokeWidth * 2);
+ paint.setColor(Color.BLACK);
+ canvas.drawPath(vPath, paint);
+ paint.setStrokeWidth(strokeWidth);
+ paint.setColor(Color.argb(255, 51, 181, 229));
+ canvas.drawPath(vPath, paint);
+ }
+
+ }
+
+ public void reset() {
+ this.sPoints = null;
+ invalidate();
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/views/PinView.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/views/PinView.java
new file mode 100644
index 0000000..f219aec
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/extension/views/PinView.java
@@ -0,0 +1,76 @@
+/*
+Copyright 2014 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.test.extension.views;
+
+import android.content.Context;
+import android.graphics.*;
+import android.util.AttributeSet;
+import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.test.R.drawable;
+
+
+public class PinView extends SubsamplingScaleImageView {
+
+ private final Paint paint = new Paint();
+ private final PointF vPin = new PointF();
+ private PointF sPin;
+ private Bitmap pin;
+
+ public PinView(Context context) {
+ this(context, null);
+ }
+
+ public PinView(Context context, AttributeSet attr) {
+ super(context, attr);
+ initialise();
+ }
+
+ public void setPin(PointF sPin) {
+ this.sPin = sPin;
+ initialise();
+ invalidate();
+ }
+
+ private void initialise() {
+ float density = getResources().getDisplayMetrics().densityDpi;
+ pin = BitmapFactory.decodeResource(this.getResources(), drawable.pushpin_blue);
+ float w = (density/420f) * pin.getWidth();
+ float h = (density/420f) * pin.getHeight();
+ pin = Bitmap.createScaledBitmap(pin, (int)w, (int)h, true);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ // Don't draw pin before image is ready so it doesn't move around during setup.
+ if (!isReady()) {
+ return;
+ }
+
+ paint.setAntiAlias(true);
+
+ if (sPin != null && pin != null) {
+ sourceToViewCoord(sPin, vPin);
+ float vX = vPin.x - (pin.getWidth()/2);
+ float vY = vPin.y - pin.getHeight();
+ canvas.drawBitmap(pin, vX, vY, paint);
+ }
+
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayActivity.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayActivity.java
new file mode 100644
index 0000000..d871ee4
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayActivity.java
@@ -0,0 +1,60 @@
+/*
+Copyright 2014 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.test.imagedisplay;
+
+import android.support.v4.app.Fragment;
+import android.util.Log;
+
+import com.davemorrissey.labs.subscaleview.test.AbstractFragmentsActivity;
+import com.davemorrissey.labs.subscaleview.test.Page;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static com.davemorrissey.labs.subscaleview.test.R.string.*;
+import static com.davemorrissey.labs.subscaleview.test.R.layout.*;
+
+public class ImageDisplayActivity extends AbstractFragmentsActivity {
+
+ private static final List<Class<? extends Fragment>> FRAGMENTS = Arrays.asList(
+ ImageDisplayLargeFragment.class,
+ ImageDisplayRotateFragment.class,
+ ImageDisplayRegionFragment.class
+ );
+
+ public ImageDisplayActivity() {
+ super(display_title, fragments_activity, Arrays.asList(
+ new Page(display_p1_subtitle, display_p1_text),
+ new Page(display_p2_subtitle, display_p2_text),
+ new Page(display_p3_subtitle, display_p3_text)
+ ));
+ }
+
+ @Override
+ protected void onPageChanged(int page) {
+ try {
+ getSupportFragmentManager()
+ .beginTransaction()
+ .replace(id.frame, FRAGMENTS.get(page).newInstance())
+ .commit();
+ } catch (Exception e) {
+ Log.e(ImageDisplayActivity.class.getName(), "Failed to load fragment", e);
+ }
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayLargeFragment.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayLargeFragment.java
new file mode 100644
index 0000000..ada7aa6
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayLargeFragment.java
@@ -0,0 +1,43 @@
+/*
+Copyright 2014 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.test.imagedisplay;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.davemorrissey.labs.subscaleview.ImageSource;
+import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+import com.davemorrissey.labs.subscaleview.test.R.layout;
+
+public class 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 View.OnClickListener() {
+ @Override public void onClick(View v) { ((ImageDisplayActivity) ImageDisplayLargeFragment.this.getActivity()).next(); }
+ });
+ SubsamplingScaleImageView imageView = rootView.findViewById(id.imageView);
+ imageView.setImage(ImageSource.asset("card.png"));
+ return rootView;
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayRegionFragment.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayRegionFragment.java
new file mode 100644
index 0000000..889e064
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayRegionFragment.java
@@ -0,0 +1,48 @@
+/*
+Copyright 2014 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.test.imagedisplay;
+
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.davemorrissey.labs.subscaleview.ImageSource;
+import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+import com.davemorrissey.labs.subscaleview.test.R.layout;
+
+public class 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 = 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 View.OnClickListener() {
+ @Override public void onClick(View v) { ((ImageDisplayActivity) ImageDisplayRegionFragment.this.getActivity()).previous(); }
+ });
+ 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/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayRotateFragment.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayRotateFragment.java
new file mode 100644
index 0000000..15632db
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/imagedisplay/ImageDisplayRotateFragment.java
@@ -0,0 +1,50 @@
+/*
+Copyright 2014 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.test.imagedisplay;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.davemorrissey.labs.subscaleview.ImageSource;
+import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+import com.davemorrissey.labs.subscaleview.test.R.layout;
+
+public class 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 = rootView.findViewById(id.imageView);
+ imageView.setImage(ImageSource.asset("eagle.jpg"));
+ imageView.setOrientation(90);
+ 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 View.OnClickListener() {
+ @Override public void onClick(View v) { ((ImageDisplayActivity) ImageDisplayRotateFragment.this.getActivity()).next(); }
+ });
+ 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/main/java/com/davemorrissey/labs/subscaleview/test/viewpager/VerticalViewPager.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/viewpager/VerticalViewPager.java
new file mode 100644
index 0000000..3d64042
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/viewpager/VerticalViewPager.java
@@ -0,0 +1,67 @@
+package com.davemorrissey.labs.subscaleview.test.viewpager;
+
+import android.content.Context;
+import android.support.v4.view.ViewPager;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+/**
+ * From http://stackoverflow.com/a/22797619/2719186
+ */
+public class VerticalViewPager extends ViewPager {
+
+ public VerticalViewPager(Context context) {
+ super(context);
+ init();
+ }
+
+ public VerticalViewPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ private void init() {
+ setPageTransformer(true, new VerticalPageTransformer());
+ setOverScrollMode(OVER_SCROLL_NEVER);
+ }
+
+ private class VerticalPageTransformer implements ViewPager.PageTransformer {
+
+ @Override
+ public void transformPage(View view, float position) {
+ if (position < -1) {
+ view.setAlpha(0);
+ } else if (position <= 1) {
+ view.setAlpha(1);
+ view.setTranslationX(view.getWidth() * -position);
+ float yPosition = position * view.getHeight();
+ view.setTranslationY(yPosition);
+ } else {
+ view.setAlpha(0);
+ }
+ }
+ }
+
+ private MotionEvent swapXY(MotionEvent ev) {
+ float width = getWidth();
+ float height = getHeight();
+ float newX = (ev.getY() / height) * width;
+ float newY = (ev.getX() / width) * height;
+ ev.setLocation(newX, newY);
+ return ev;
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev){
+ boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
+ swapXY(ev);
+ return intercepted;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ return super.onTouchEvent(swapXY(ev));
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/viewpager/ViewPagerActivity.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/viewpager/ViewPagerActivity.java
new file mode 100644
index 0000000..30eebfe
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/viewpager/ViewPagerActivity.java
@@ -0,0 +1,98 @@
+/*
+Copyright 2014 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.test.viewpager;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentStatePagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.view.View;
+
+import com.davemorrissey.labs.subscaleview.test.AbstractPagesActivity;
+import com.davemorrissey.labs.subscaleview.test.Page;
+import com.davemorrissey.labs.subscaleview.test.R;
+
+import java.util.Arrays;
+
+import static com.davemorrissey.labs.subscaleview.test.R.layout.view_pager;
+import static com.davemorrissey.labs.subscaleview.test.R.string.pager_p1_subtitle;
+import static com.davemorrissey.labs.subscaleview.test.R.string.pager_p1_text;
+import static com.davemorrissey.labs.subscaleview.test.R.string.pager_p2_subtitle;
+import static com.davemorrissey.labs.subscaleview.test.R.string.pager_p2_text;
+import static com.davemorrissey.labs.subscaleview.test.R.string.pager_title;
+
+public class ViewPagerActivity extends AbstractPagesActivity {
+
+ private static final String[] IMAGES = { "eagle.jpg", "pony.jpg" };
+
+ 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);
+ ViewPager horizontalPager = findViewById(R.id.horizontal_pager);
+ horizontalPager.setAdapter(new ScreenSlidePagerAdapter(getSupportFragmentManager()));
+ ViewPager verticalPager = findViewById(R.id.vertical_pager);
+ verticalPager.setAdapter(new ScreenSlidePagerAdapter(getSupportFragmentManager()));
+ }
+
+ @Override
+ public void onBackPressed() {
+ ViewPager viewPager = findViewById(getPage() == 0 ? R.id.horizontal_pager : R.id.vertical_pager);
+ if (viewPager.getCurrentItem() == 0) {
+ super.onBackPressed();
+ } else {
+ viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
+ }
+ }
+
+ @Override
+ 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 {
+ ScreenSlidePagerAdapter(FragmentManager fm) {
+ super(fm);
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ ViewPagerFragment fragment = new ViewPagerFragment();
+ fragment.setAsset(IMAGES[position]);
+ return fragment;
+ }
+
+ @Override
+ public int getCount() {
+ return IMAGES.length;
+ }
+ }
+
+}
diff --git a/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/viewpager/ViewPagerFragment.java b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/viewpager/ViewPagerFragment.java
new file mode 100644
index 0000000..7058137
--- /dev/null
+++ b/sample/src/main/java/com/davemorrissey/labs/subscaleview/test/viewpager/ViewPagerFragment.java
@@ -0,0 +1,69 @@
+/*
+Copyright 2014 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.test.viewpager;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.davemorrissey.labs.subscaleview.ImageSource;
+import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
+import com.davemorrissey.labs.subscaleview.test.R.id;
+import com.davemorrissey.labs.subscaleview.test.R.layout;
+
+public class ViewPagerFragment extends Fragment {
+
+ private static final String BUNDLE_ASSET = "asset";
+
+ private String asset;
+
+ public ViewPagerFragment() {
+ }
+
+ public void setAsset(String asset) {
+ this.asset = asset;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View rootView = inflater.inflate(layout.view_pager_page, container, false);
+
+ if (savedInstanceState != null) {
+ if (asset == null && savedInstanceState.containsKey(BUNDLE_ASSET)) {
+ asset = savedInstanceState.getString(BUNDLE_ASSET);
+ }
+ }
+ if (asset != null) {
+ SubsamplingScaleImageView imageView = rootView.findViewById(id.imageView);
+ imageView.setImage(ImageSource.asset(asset));
+ }
+
+ return rootView;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ View rootView = getView();
+ if (rootView != null) {
+ outState.putString(BUNDLE_ASSET, asset);
+ }
+ }
+
+}