Hi !

Thanks for the link, the GestureDetector is nice. I started working on
this today, and found another way to "zoom & move", which I think may
be simpler.

All you need is to set a specific Matrix on an ImageView. The matrix
will apply transformations on the image (here we just want to scale
and translate).

In your layout, just put an ImageView:
<ImageView
android:id="@+id/zoom_test"
android:adjustViewBounds="false"
android:cropToPadding="false"
android:scaleType="matrix"
android:src="@drawable/some_drawable"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>


In your activity code:

ImageView zoomTest = (ImageView) findViewById(R.id.zoom_test);

Matrix mtrx = new Matrix();

mtrx.postScale(1.5f, 1.5f);
mtrx.postTranslate(-120f, -120f);
zoomTest.setImageMatrix(mtrx);
zoomTest.invalidate();


I still need to find the appropriate values, and let the user
manipulate the GestureDetector and press the zoom button, but I think
I will go that way.

I found this solution by reading ImageView source code, and reading
this: 
http://groups.google.com/group/android-developers/browse_thread/thread/bdc4998a70f310c7

More on this topic when I'll have done the whole stuff.



On Jul 4, 8:13 pm, Tane Piper <[email protected]> wrote:
> Hey Piawi,
>
> Actually I've found this:
>
> http://groups.google.com/group/android-developers/browse_thread/threa...
>
> I've managed to modify it a little bit and it works reasonably well.
> It's not perfect, but I'm sure any issues can be ironed out.
>
> Regards,
> Tane
>
> On Jul 4, 2:11 pm,Piwaï<[email protected]> wrote:
>
> > Hi,
>
> > I am sorry I won't be of any help on this topic. But I will have to
> > develop exactly that functionnality (an image viewer being part of an
> > Android application) starting on tuesday. So if you find any solution
> > to your problem, please do not hesitate to post it. And if I find a
> > solution (but I won't work on this before tuesday), I promess I'll
> > post it ;-).
>
> > Best Regards,
> >Piwaï
>
> > On Jul 4, 12:50 am, Tane Piper <[email protected]> wrote:
>
> > > Hey folks,
>
> > > A few weeks ago I posted a view I was working on and in that time I
> > > have improved the view a lot, but I've been asked to add a new
> > > features of zooming into the image.
>
> > > The view is a custom image viewer that allows large images (such as
> > > 640x1000) to be loaded, and the user to scroll around using either the
> > > touchscreen or trackball on the device.  The code below is reasonably
> > > succesful in that it works at the default scale level of 1.
>
> > > But with addign zooming, instead of zooming into the 'centre' of the
> > > location the user is looking at, and allowing the user to move around
> > > the whole of the image at this level it instead zooms into the top and
> > > left of the location, and in doing so it starts to cut off the bottom
> > > and right of the image whole, so while zoomed in you cannot go any
> > > ruther right or down in the image, but you can go to the top and left
> > > easily enough.
>
> > > The best example of what I am trying to achive is the Image viewer in
> > > the camera application.
>
> > > So my two questions are:
>
> > > 1) Can anyone suggest how I can fix this in the canvas or
> > > 2) Is there a better way to do this with an existing feature in the
> > > framework?
>
> > > I'm probably thinking it's something to do with the modifierValue when
> > > scrolling around that I somehow need to increase this, but trying this
> > > causes my activity to crash.
>
> > > Code:
>
> > > public class ZN5ScrollView extends View {
>
> > >         public ZN5ScrollView(Context context, AttributeSet attrs) {
> > >                 super(context, attrs);
>
> > >                 scrollX = 0;
> > >                 scrollY = 0;
> > >                 scale = 1.0f;
> > >                 modifierValue = 50;
>
> > >                 ViewPaint = new Paint();
>
> > >                 TypedArray a = context.obtainStyledAttributes(attrs,
> > > R.styleable.ZN5ScrollView);
> > >                 LoadedBitmap = 
> > > BitmapFactory.decodeResource(context.getResources(),
> > > a.getResourceId(R.styleable.ZN5ScrollView_src, R.drawable.icon));
>
> > >                 IMAGE_WIDTH = LoadedBitmap.getWidth();
> > >                 IMAGE_HEIGHT = LoadedBitmap.getHeight();
>
> > >                 ViewBitmap = Bitmap.createBitmap(LoadedBitmap);
> > >         }
>
> > >         protected void onSizeChanged  (int w, int h, int oldw, int oldh) {
> > >                 SCREEN_WIDTH = w;
> > >                 SCREEN_HEIGHT = h;
>
> > >                 if (IMAGE_WIDTH < SCREEN_WIDTH) {
> > >                         IMAGE_WIDTH = SCREEN_WIDTH - scrollX;
> > >                 }
> > >                 if (IMAGE_HEIGHT < SCREEN_HEIGHT) {
> > >                         IMAGE_HEIGHT = SCREEN_HEIGHT - scrollY;
> > >                 }
>
> > >         }
>
> > >         @Override
> > >     protected void onDraw(Canvas canvas) {
> > >         super.onDraw(canvas);
> > >         canvas.scale(scale, scale);
> > >         canvas.drawBitmap(ViewBitmap, 0f, 0f, ViewPaint);
> > >     }
>
> > > public void handleView(int zoomType) {
> > >         switch (zoomType) {
> > >         case ZOOM_IN:
> > >                 if (scale <= 1.5f) {
> > >                         scale = scale + 0.1f;
> > >                 }
> > >                 break;
> > >         case ZOOM_OUT:
> > >                 if (scale > 1.0f) {
> > >                         scale = scale -0.1f;
> > >                 }
> > >                 break;
> > >         }
> > >         invalidate();
>
> > > }
>
> > > public void handleScroll(float distX, float distY) {
> > >         /* X-Axis */
> > >         if(distX > 6.0) {
> > >                 if(scrollX < IMAGE_WIDTH) {
> > >                         scrollX = Math.min(IMAGE_WIDTH - SCREEN_WIDTH, 
> > > scrollX +
> > > modifierValue);
> > >                 }
> > >         }
> > >         else if(distX < -6.0) {
> > >                 if(scrollX >= 50) {
> > >                         scrollX = Math.min(IMAGE_WIDTH + SCREEN_WIDTH, 
> > > scrollX -
> > > modifierValue);
> > >                 } else {
> > >                         scrollX = 0;
> > >                 }
> > >         }
>
> > >         /* Y-Axis*/
> > >         if(distY > 6.0) {
> > >                 if(scrollY < IMAGE_HEIGHT) {
> > >                         scrollY = Math.min(IMAGE_HEIGHT - SCREEN_HEIGHT, 
> > > scrollY +
> > > modifierValue);
> > >                 }
> > >         }
> > >         else if(distY < -6.0) {
> > >                 if(scrollY >= 50) {
> > >                         scrollY = Math.min(IMAGE_HEIGHT + SCREEN_HEIGHT, 
> > > scrollY -
> > > modifierValue);
> > >                 } else {
> > >                         scrollY = 0;
> > >                 }
> > >         }
>
> > >         if((scrollX <= IMAGE_WIDTH) && (scrollY <= IMAGE_HEIGHT)) {
> > >                 ViewBitmap = Bitmap.createBitmap(LoadedBitmap, scrollX, 
> > > scrollY,
> > > SCREEN_WIDTH, SCREEN_HEIGHT);
> > >                 invalidate();
> > >         }
>
> > > }
>
> > > private int modifierValue;
>
> > > private float scale;
> > > public final int ZOOM_IN = 1;
> > > public final int ZOOM_OUT = 2;
>
> > > private int SCREEN_WIDTH;
> > > private int SCREEN_HEIGHT;
>
> > > private int IMAGE_WIDTH;
> > > private int IMAGE_HEIGHT;
>
> > > private int scrollX;
> > > private int scrollY;
>
> > > private Bitmap LoadedBitmap;
> > > private Bitmap ViewBitmap;
> > > private Paint ViewPaint;
>
> > > }
>
> > > Regards,
> > > Tane
>
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to