开发者

scrolling image after zooming

this project work and perform only zoom on double click but it does not scroll or show whole image when it big

so please help me for scrolling image after zooming

ImageView_Zoom.java

package com.example.ImageView_Zoom;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.ScaleAnimation;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.Toast;

import com.example.ImageView_Zoom.SimpleGestureFilter.SimpleGestureListener;

public class ImageView_Zoom extends Activity implements SimpleGestureListener {
    ImageView iv;
    int i = 0, x = 0, y = 0;
    private SimpleGestureFilter detector;
    ScrollView sv;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         iv=new ImageView(this);
        //iv = (ImageView) findViewById(R.id.zoom_test);
        iv.setBackgroundResource(R.drawable.c3);
        sv = (ScrollView) findViewById(R.id.zoom);

        detector = new SimpleGestureFilter(this, this);
        //iv.setLayoutParams(new LayoutParams(560,560));
        setContentView(iv,new LayoutParams(320,480));
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent me) {
        this.detector.onTouchEvent(me);
        return super.dispatchTouchEvent(me);
    }

    @Override
    public void onSwipe(int direction) {
        String str = "";
        switch (direction) {
        case SimpleGestureFilter.SWIPE_RIGHT:
            str = "Swipe Right";
            break;
        case SimpleGestureFilter.SWIPE_LEFT:
            str = "Swipe Left";
            break;
        case SimpleGestureFilter.SWIPE_DOWN:
            str = "Swipe Down";
            break;
        case SimpleGestureFilter.SWIPE_UP:
            str = "Swipe Up";
            break;
        }
        Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDoubleTap() {

        if (i == 0) {

            ScaleAnimation n = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f, x, y);
            iv.startAnimation(n);
            //sv.setLayoutParams(new LayoutParams(320,500));
            n.setFillAfter(true);
            //this.iv.setLayoutParams(new LayoutParams(400, 500));
            i = 1;
        } else {
            ScaleAnimation n = new ScaleAnimation(1.5f, 1.0f, 1.5f, 1.0f, 160,
                    240);
            iv.startAnimation(n);
            n.setFillAfter(true);
            i = 0;
        }
        Toast.makeText(this, "Double Tap", Toast.LENGTH_SHORT).show();
    }

    public boolean onTouchEvent(MotionEvent event) {
        x = (int) event.getX();
        y = (int) event.getY();
        return false;
    }
}

SimpleGestureFilter.java

package com.example.ImageView_Zoom;

import android.app.Activity;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;

public class SimpleGestureFilter extends SimpleOnGestureListener {

    public final static int SWIPE_UP = 1;
    public final static int SWIPE_DOWN = 2;
    public final static int SWIPE_LEFT = 3;
    public final static int SWIPE_RIGHT = 4;

    public final static int MODE_TRANSPARENT = 0;
    public final static int MODE_SOLID = 1;
    public final static int MODE_DYNAMIC = 2;

    private final static int ACTION_FAKE = -13; // just an unlikely number
    private int swipe_Min_Distance = 100;
    private int swipe_Max_Distance = 350;
    private int swipe_Min_Velocity = 100;

    private int mode = MODE_DYNAMIC;
    private boolean running = true;
    private boolean tapIndicator = false;

    private Activity context;
    private GestureDetector detector;
    private SimpleGestureListener listener;

    public SimpleGestureFilter(Activity context, SimpleGestureListener sgl) {

        this.context = context;
        this.detector = new GestureDetector(context, this);
        this.listener = sgl;
    }

    public void onTouchEvent(MotionEvent event) {

        if (!this.running)
            return;
        boolean result = this.detector.onTouchEvent(event);

        if (this.mode == MODE_SOLID)
            event.setAction(MotionEvent.ACTION_CANCEL);
        else if (this.mode == MODE_DYNAMIC) {
            if (event.getAction() == ACTION_FAKE)
                event.setAction(MotionEvent.ACTION_UP);
            else if (result)
                event.setAction(MotionEvent.ACTION_CANCEL);
            else if (this.tapIndicator) {
                event.setAction(MotionEvent.ACTION_DOWN);
                this.tapIndicator = false;
            }
        }
        // else just do nothing, it's Transparent
    }

    public void setMode(int m) {
        this.mode = m;
    }

    public int getMode() {
        return this.mode;
    }

    public void setEnabled(boolean status) {
        this.running = status;
    }

    public void setSwipeMaxDistance(int distance) {
        this.swipe_Max_Distance = distance;
    }

    public void setSwipeMinDistance(int distance) {
        this.swipe_Min_Distance = distance;
    }

    public void setSwipeMinVelocity(int distance) {
        this.swipe_Min_Velocity = distance;
    }

    public int getSwipeMaxDistance() {
        return this.swipe_Max_Distance;
    }

    public int getSwipeMinDistance() {
        return this.swipe_Min_Distance;
    }

    public int getSwipeMinVelocity() {
        return this.swipe_Min_Velocity;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        final float xDistance = Math.abs(e1.getX() - e2.getX());
        final float yDistance = Math.abs(e1.getY() - e2.getY());
        //Log.d("xDistance","="+xDistance);
        //Log.d("yDistance","="+yDistance);
        if (xDistance > this.swipe_Max_Distance
                || yDistance > this.swipe_Max_Distance)
            return false;
        velocityX = Math.abs(velocityX);
        velocityY = Math.abs(velocityY);
        boolean result = false;
        if (velocityX > this.swipe_Min_Velocity
                && xDistance > this.swipe_Min_Distance) {
            if (e1.getX() > e2.getX()) // right to left
                this.listener.onSwipe(SWIPE_LEFT);
            else
                this.listener.onSwipe(SWIPE_RIGHT);
            result = true;
        } else if (velocityY > this.swipe_Min_Velocity
                && yDistance > this.swipe_Min_Distance) {
            if (e1.getY() > e2.getY()) // bottom to up
                this.listener.onSwipe(SWIPE_UP);
            else
                this.listener.onSwipe(SWIPE_DOWN);
            result = true;
        }
        return result;
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        this.tapIndicator = true;
        return false;
    }

    @Override
    public boolean onDoubleTap(MotionEvent arg0) {
        this.listener.onDoubleTap();
        return true;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent arg0) {
        return true;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent arg0) {
        if (this.mode == MODE_DYNAMIC) { // we owe an ACTION_UP, so we fake an action
            arg0.setAction(ACTION_FAKE); // which will be converted to an ACTION_UP later.
            this.context.dispatchTouchEvent(arg0);
        }
        return false;
    }

    static interface SimpleGestureListener {
        void onSwipe(int direction);
        void onDou开发者_Go百科bleTap();
    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/zoom_test"
android:adjustViewBounds="false"
android:cropToPadding="false"
android:scaleType="matrix"
android:src="@drawable/doll"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜