如何在android翻转动画师中为图像视图添加触摸放大

时间:2016-09-01 09:08:32

标签: android animation zoom ontouch

public class FlipViewFragment extends Fragment {

    public static final String ARG_ITEM_ID = "FlipViewFragment";

    public static Boolean autoplay = false;
    FlipViewController flipView = null;

    Context mContext;

    public Boolean autoplaycompleted = false;

    ImageView imageDetail;
    Matrix matrix = new Matrix();
    float scale = 1f;

    ScaleGestureDetector SGD;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.container_flipview,
                container, false);

        imageDetail = (ImageView) rootView.findViewById(R.id.imageView1);
        imageDetail.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                SGD.onTouchEvent(motionEvent);
                return true;
            }
        });

        return ViewFlipViewLayout();
        // return rootView;
    }

    public View ViewFlipViewLayout() {
        ArrayList<Integer> images = new ArrayList<Integer>();
        images.add(R.drawable.image1);
        images.add(R.drawable.image2);
        images.add(R.drawable.image3);


        // You can also use FlipViewController.VERTICAL
        flipView = new FlipViewController(getActivity(),
                FlipViewController.HORIZONTAL);

        // We're creating a NoteViewAdapter instance, by passing in the current
        // context and the
        // values to display after each flip
        flipView.setAdapter(new ImageViewAdapter(getActivity(), images));
        // flipView.onInterceptTouchEvent(MotionEvent event);
        // setContentView(flipView);

        return flipView;
    }

    public void AutoPlayAlbum() {
        // Toast.makeText(getApplicationContext(), "Service Running",
        // Toast.LENGTH_LONG).show();

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {

                if (autoplay) {
                    if (flipView.autoFlip()) {
                        AutoPlayAlbum();
                    } else {
                        Context mContext = MainActivity.mContext;
                        ((MainActivity) mContext).btnAutoPlay
                                .setBackgroundResource(android.R.drawable.ic_media_play);
                        autoplay = false;

                        ((MainActivity) mContext).mPlayer.pause();
                        ((MainActivity) mContext).length = ((MainActivity) mContext).mPlayer
                                .getCurrentPosition();
                        ((MainActivity) mContext).btnSound
                                .setBackgroundResource(android.R.drawable.ic_lock_silent_mode);
                        autoplaycompleted = true;
                    }
                }
            }
        }, 6000);

    }

    public void restartAutoPlay() {
        Log.e("Restart", "true");
        // flipView.restartFlip(getActivity(), FlipViewController.HORIZONTAL);
        // Reload current fragment
        Fragment frg = null;
        frg = getFragmentManager().findFragmentByTag(ARG_ITEM_ID);
        final FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.detach(frg);
        ft.attach(frg);
        ft.commit();
    }

    private void GarbageCollector() {
        System.gc();
        Runtime.getRuntime().gc();
    }

    public class ImageViewAdapter extends BaseAdapter {



        ImageView imgView;
        Bitmap bitmap;
        int bmpWidth, bmpHeight;

        // Touch event related variables
        int touchState;
        final int IDLE = 0;
        final int TOUCH = 1;
        final int PINCH = 2;
        float dist0, distCurrent;

        private LayoutInflater inflater;
        private ArrayList<Integer> images;

        public ImageViewAdapter(Context currentContext,
                ArrayList<Integer> allImages) {
            inflater = LayoutInflater.from(currentContext);
            images = allImages;
        }

        @Override
        public int getCount() {
            return images.size();
        }

        @Override
        public Object getItem(int position) {
            return position;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View layout = convertView;

            GarbageCollector();

            if (convertView == null) {
                layout = inflater.inflate(R.layout.container_flipview, null);
            }

            // Get's value from our ArrayList by the position
            Integer image = images.get(position);

            imgView = (ImageView) layout.findViewById(R.id.imageView1);

            // imgView.setText(note);
            // imgView.setImageResource(image);

            bitmap = BitmapFactory.decodeResource(getResources(), image);
            bmpWidth = bitmap.getWidth();
            bmpHeight = bitmap.getHeight();

            distCurrent = 1; // Dummy default distance
            dist0 = 1; // Dummy default distance
            imgView.setImageBitmap(bitmap);
            imgView.setOnTouchListener(new View.OnTouchListener() {

                @Override
                public boolean onTouch(View arg0, MotionEvent arg1) {

                    return false;
                }
            });
            // imgView.setOnTouchListener(new OnTouchListener() {
            //
            // @Override
            // public boolean onTouch(View view, MotionEvent motionEvent) {
            // SGD.onTouchEvent(motionEvent);
            // return true;
            // }
            // });

            /*
             * Context mContext = MainActivity.mContext; RelativeLayout
             * container = (RelativeLayout) ((MainActivity) mContext)
             * .findViewById(R.id.content_container); container.bringToFront();
             */

            return layout;
        }

    }
}

我希望在触摸图像时为图像视图添加放大和缩小。翻转后图像应该达到默认大小。从一个图像翻转到另一个图像后,它必须恢复到原始大小

1 个答案:

答案 0 :(得分:0)

试试这段代码

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.widget.ImageView;

public class ZoomableImageView extends ImageView
{
  Matrix matrix = new Matrix();

static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
static final int CLICK = 3;
int mode = NONE;

PointF last = new PointF();
PointF start = new PointF();
float minScale = 1f;
float maxScale = 4f;
float[] m;

float redundantXSpace, redundantYSpace;
float width, height;
float saveScale = 1f;
float right, bottom, origWidth, origHeight, bmWidth, bmHeight;

ScaleGestureDetector mScaleDetector;
Context context;

public ZoomableImageView(Context context, AttributeSet attr)
{
    super(context, attr);
    super.setClickable(true);
    this.context = context;
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
    matrix.setTranslate(1f, 1f);
    m = new float[9];
    setImageMatrix(matrix);
    setScaleType(ScaleType.MATRIX);

    setOnTouchListener(new OnTouchListener()
    {

        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            mScaleDetector.onTouchEvent(event);

            matrix.getValues(m);
            float x = m[Matrix.MTRANS_X];
            float y = m[Matrix.MTRANS_Y];
            PointF curr = new PointF(event.getX(), event.getY());

            switch (event.getAction())
            {
                //when one finger is touching
                //set the mode to DRAG
                case MotionEvent.ACTION_DOWN:
                    last.set(event.getX(), event.getY());
                    start.set(last);
                    mode = DRAG;
                    break;
                //when two fingers are touching
                //set the mode to ZOOM
                case MotionEvent.ACTION_POINTER_DOWN:
                    last.set(event.getX(), event.getY());
                    start.set(last);
                    mode = ZOOM;
                    break;
                //when a finger moves
                //If mode is applicable move image
                case MotionEvent.ACTION_MOVE:
                    //if the mode is ZOOM or
                    //if the mode is DRAG and already zoomed
                    if (mode == ZOOM || (mode == DRAG && saveScale > minScale))
                    {
                        float deltaX = curr.x - last.x;// x difference
                        float deltaY = curr.y - last.y;// y difference
                        float scaleWidth = Math.round(origWidth * saveScale);// width after applying current scale
                        float scaleHeight = Math.round(origHeight * saveScale);// height after applying current scale
                        //if scaleWidth is smaller than the views width
                        //in other words if the image width fits in the view
                        //limit left and right movement
                        if (scaleWidth < width)
                        {
                            deltaX = 0;
                            if (y + deltaY > 0)
                                deltaY = -y;
                            else if (y + deltaY < -bottom)
                                deltaY = -(y + bottom);
                        }
                        //if scaleHeight is smaller than the views height
                        //in other words if the image height fits in the view
                        //limit up and down movement
                        else if (scaleHeight < height)
                        {
                            deltaY = 0;
                            if (x + deltaX > 0)
                                deltaX = -x;
                            else if (x + deltaX < -right)
                                deltaX = -(x + right);
                        }
                        //if the image doesnt fit in the width or height
                        //limit both up and down and left and right
                        else
                        {
                            if (x + deltaX > 0)
                                deltaX = -x;
                            else if (x + deltaX < -right)
                                deltaX = -(x + right);

                            if (y + deltaY > 0)
                                deltaY = -y;
                            else if (y + deltaY < -bottom)
                                deltaY = -(y + bottom);
                        }
                        //move the image with the matrix
                        matrix.postTranslate(deltaX, deltaY);
                        //set the last touch location to the current
                        last.set(curr.x, curr.y);
                    }
                    break;
                //first finger is lifted
                case MotionEvent.ACTION_UP:
                    mode = NONE;
                    int xDiff = (int) Math.abs(curr.x - start.x);
                    int yDiff = (int) Math.abs(curr.y - start.y);
                    if (xDiff < CLICK && yDiff < CLICK)
                        performClick();
                    break;
                // second finger is lifted
                case MotionEvent.ACTION_POINTER_UP:
                    mode = NONE;
                    break;
            }
            setImageMatrix(matrix);
            invalidate();
            return true;
        }

    });
}

@Override
public void setImageBitmap(Bitmap bm)
{
    super.setImageBitmap(bm);
    bmWidth = bm.getWidth();
    bmHeight = bm.getHeight();
}

public void setMaxZoom(float x)
{
    maxScale = x;
}

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener
{

    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector)
    {
        mode = ZOOM;
        return true;
    }

    @Override
    public boolean onScale(ScaleGestureDetector detector)
    {
        float mScaleFactor = detector.getScaleFactor();
        float origScale = saveScale;
        saveScale *= mScaleFactor;
        if (saveScale > maxScale)
        {
            saveScale = maxScale;
            mScaleFactor = maxScale / origScale;
        }
        else if (saveScale < minScale)
        {
            saveScale = minScale;
            mScaleFactor = minScale / origScale;
        }
        right = width * saveScale - width - (2 * redundantXSpace * saveScale);
        bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
        if (origWidth * saveScale <= width || origHeight * saveScale <= height)
        {
            matrix.postScale(mScaleFactor, mScaleFactor, width / 2, height / 2);
            if (mScaleFactor < 1)
            {
                matrix.getValues(m);
                float x = m[Matrix.MTRANS_X];
                float y = m[Matrix.MTRANS_Y];
                if (mScaleFactor < 1)
                {
                    if (Math.round(origWidth * saveScale) < width)
                    {
                        if (y < -bottom)
                            matrix.postTranslate(0, -(y + bottom));
                        else if (y > 0)
                            matrix.postTranslate(0, -y);
                    }
                    else
                    {
                        if (x < -right)
                            matrix.postTranslate(-(x + right), 0);
                        else if (x > 0)
                            matrix.postTranslate(-x, 0);
                    }
                }
            }
        }
        else
        {
            matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY());
            matrix.getValues(m);
            float x = m[Matrix.MTRANS_X];
            float y = m[Matrix.MTRANS_Y];
            if (mScaleFactor < 1) {
                if (x < -right)
                    matrix.postTranslate(-(x + right), 0);
                else if (x > 0)
                    matrix.postTranslate(-x, 0);
                if (y < -bottom)
                    matrix.postTranslate(0, -(y + bottom));
                else if (y > 0)
                    matrix.postTranslate(0, -y);
            }
        }
        return true;
    }
}

@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
{
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    width = MeasureSpec.getSize(widthMeasureSpec);
    height = MeasureSpec.getSize(heightMeasureSpec);
    //Fit to screen.
    float scale;
    float scaleX =  width / bmWidth;
    float scaleY = height / bmHeight;
    scale = Math.min(scaleX, scaleY);
    matrix.setScale(scale, scale);
    setImageMatrix(matrix);
    saveScale = 1f;

    // Center the image
    redundantYSpace = height - (scale * bmHeight) ;
    redundantXSpace = width - (scale * bmWidth);
    redundantYSpace /= 2;
    redundantXSpace /= 2;

    matrix.postTranslate(redundantXSpace, redundantYSpace);

    origWidth = width - 2 * redundantXSpace;
    origHeight = height - 2 * redundantYSpace;
    right = width * saveScale - width - (2 * redundantXSpace * saveScale);
    bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
    setImageMatrix(matrix);
}

}