我使用http://android.jmsliu.com/138/android-infinite-loop-gallery.html给出的代码创建了一个封面流。
它工作正常。现在我的问题是如何实现图像的捏缩放。?
我使用了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();
}
}
现在我需要在图库中滑动图像并缩放视图中的当前图像。
答案 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();
}
}