如何使用Android中的缩放变焦来缩放coverflow图像

时间:2011-11-10 10:26:27

标签: android imageview zoom pinch

我使用http://android.jmsliu.com/138/android-infinite-loop-gallery.html给出的代码创建了一个封面流。 enter image description here

它工作正常。现在我的问题是如何实现图像的捏缩放。?

我使用了TouchImageView类而不是ImagView。但它不起作用。

下面给出的

是TouchImageView.java

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

   public class TouchImageView extends ImageView {

Matrix matrix = new Matrix();

// We can be in one of these 3 states
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;

// Remember some things for zooming
PointF last = new PointF();
PointF start = new PointF();
float minScale = 1f;
float maxScale = 3f;
float[] m;

float redundantXSpace, redundantYSpace;

float width, height;
static final int CLICK = 3;
float saveScale = 1f;
float right, bottom, origWidth, origHeight, bmWidth, bmHeight;

ScaleGestureDetector mScaleDetector;

Context context;


public TouchImageView(Context context) {
    super(context);
    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()) {
                case MotionEvent.ACTION_DOWN:
                    last.set(event.getX(), event.getY());
                    start.set(last);
                    mode = DRAG;
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (mode == DRAG) {
                        float deltaX = curr.x - last.x;
                        float deltaY = curr.y - last.y;
                        float scaleWidth = Math.round(origWidth * saveScale);
                        float scaleHeight = Math.round(origHeight * saveScale);
                        if (scaleWidth < width) {
                            deltaX = 0;
                            if (y + deltaY > 0)
                                deltaY = -y;
                            else if (y + deltaY < -bottom)
                                deltaY = -(y + bottom); 
                        } else if (scaleHeight < height) {
                            deltaY = 0;
                            if (x + deltaX > 0)
                                deltaX = -x;
                            else if (x + deltaX < -right)
                                deltaX = -(x + 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);
                        }
                        matrix.postTranslate(deltaX, deltaY);
                        last.set(curr.x, curr.y);
                    }
                    break;

                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;

                case MotionEvent.ACTION_POINTER_UP:
                    mode = NONE;
                    break;
            }
            setImageMatrix(matrix);
            invalidate();
            return true; // indicate event was handled
        }

    });
}

@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 = (float)Math.min(Math.max(.95f, detector.getScaleFactor()), 1.05);
        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 =  (float)width / (float)bmWidth;
    float scaleY = (float)height / (float)bmHeight;
    scale = Math.min(scaleX, scaleY);
    matrix.setScale(scale, scale);
    setImageMatrix(matrix);
    saveScale = 1f;

    // Center the image
    redundantYSpace = (float)height - (scale * (float)bmHeight) ;
    redundantXSpace = (float)width - (scale * (float)bmWidth);
    redundantYSpace /= (float)2;
    redundantXSpace /= (float)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);
}
}

任何人都可以帮我解决这个问题..

提前致谢

我在这里添加我的班级文件。

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.View.OnLongClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.Toast;




public class InfiniteGalleryActivity extends Activity {

public static int pos;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            InfiniteGallery gallery = (InfiniteGallery) findViewById(R.id.mygallery);
            gallery.setAdapter(new ImageAdapter(this));

            gallery.setOnTouchListener(new OnTouchListener() {


                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction() & MotionEvent.ACTION_MASK) {

                    case MotionEvent.ACTION_POINTER_DOWN:

                         Intent intent = new Intent(InfiniteGalleryActivity.this, TouchImageViewActivity.class);
                            intent.putExtra("postion", pos);
                            startActivity(intent);
                        }
                    return false;
                }


            });

    }
    public class ImageAdapter extends BaseAdapter {
            private LayoutInflater inflater = null;

            private final Integer[] imageDataList = { R.drawable.a, R.drawable.b,
                            R.drawable.c};

            public ImageAdapter(Context c) {
                    inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            }

            public int getCount() {
                    if (imageDataList != null) {
                            return imageDataList.length;
                    } else {
                            return 0;
                    }
            }

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

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

            public View getView(int position, View convertView, ViewGroup parent) {
                    View view = convertView;
                    pos =position;
                    if (view == null) {
                            view = inflater.inflate(R.layout.itemrender, parent, false);
                    }

                    ((ImageView) view).setImageResource(imageDataList[position]);
                    return view;
            }
    }
   }

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;

public class TouchImageViewActivity extends Activity {
Bitmap imageToBeZoom = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try {
        int postion = getIntent().getExtras().getInt("position");

                    // Here you must add the resource id for image potion.
                    int resourse_id = postion;// get the resouce id here e.g arr[postion];
        BitmapFactory.decodeResource(getResources(), resourse_id);
        imageToBeZoom = BitmapFactory.decodeFile(imagePath);

        ZoomableImageView zoom = new ZoomableImageView(TouchImageViewActivity.this);
        zoom.setBitmap(imageToBeZoom);
        zoom.setHandler(handler);

        LayoutParams parms = new LayoutParams(new LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.FILL_PARENT));
        LinearLayout layou = new LinearLayout(TouchImageViewActivity.this);
        layou.setBackgroundResource(R.color.black);
        layou.addView(zoom, parms);
        setContentView(layou);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
protected void onDestroy() {
    if (imageToBeZoom != null && imageToBeZoom.isRecycled() == false) {
        imageToBeZoom.recycle();
    }
    super.onDestroy();
}
}

现在我需要在图库中滑动图像并缩放视图中的当前图像。

1 个答案:

答案 0 :(得分:1)

public class InfiniteGalleryActivity extends Activity {

    public static int pos;
    ImageAdapter adapter = null;
    InfiniteGallery gallery = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        gallery = (InfiniteGallery) findViewById(R.id.mygallery);
        adapter = new ImageAdapter(this);
        gallery.setAdapter(adapter);

        gallery.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction() & MotionEvent.ACTION_MASK) {

                case MotionEvent.ACTION_POINTER_DOWN:

                    Intent intent = new Intent(InfiniteGalleryActivity.this, TouchImageViewActivity.class);
                    pos = gallery.getSelectedItemPosition();
                    int resId = adapter.getResId(pos);
                    intent.putExtra("resource_id", resId);
                    startActivity(intent);
                }
                return false;
            }

        });

    }

    public class ImageAdapter extends BaseAdapter {
        private LayoutInflater inflater = null;

        private final int[] imageDataList = { R.drawable.a, R.drawable.b, R.drawable.c };

        public ImageAdapter(Context c) {
            inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        public int getCount() {
                if (imageDataList != null) {
                return imageDataList.length;
            } else {
                return 0;
            }
        }

        public int getResId(int position) {
            return imageDataList[position];
        }

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

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

        public View getView(int position, View convertView, ViewGroup parent) {
            View view = convertView;
            pos = position;
            if (view == null) {
                view = inflater.inflate(R.layout.itemrender, parent, false);
            }

            ((ImageView) view).setImageResource(imageDataList[position]);
            return view;
        }
    }
}

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;

public class TouchImageViewActivity extends Activity {
Bitmap imageToBeZoom = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try {
        int rid = getIntent().getExtras().getInt("resource_id");

        BitmapFactory.decodeResource(getResources(), rid);
        imageToBeZoom = BitmapFactory.decodeFile(imagePath);

        ZoomableImageView zoom = new ZoomableImageView(TouchImageViewActivity.this);
        zoom.setBitmap(imageToBeZoom);

        LayoutParams parms = new LayoutParams(new LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.FILL_PARENT));
        LinearLayout layou = new LinearLayout(TouchImageViewActivity.this);
        layou.setBackgroundResource(android.R.color.black);
        layou.addView(zoom, parms);
        setContentView(layou);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
protected void onDestroy() {
    if (imageToBeZoom != null && imageToBeZoom.isRecycled() == false) {
        imageToBeZoom.recycle();
    }
    super.onDestroy();
}
}