diff options
Diffstat (limited to 'sample/src/main/java/com/davemorrissey/labs/subscaleview/test')
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); + } + } + +} |