[英]Implementing a Gallery with pinch zoom
我有一个图片库,我正在尝试对其进行缩放。 另外,它们工作正常。 问题是,我无法终生将他们两个捆绑在一起! 我试图将ImageAdapter中的ImageZoomView绑定无济于事。 用户单击图像时我应该尝试这样做吗? 还有其他想法吗? 这是ImageAdapter.class中的返回Gallery元素的代码:
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i = new ImageView(mContext);
Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(),mImageIds[position]);
i.setLayoutParams(new Gallery.LayoutParams(300, 450));
i.setScaleType(ImageView.ScaleType.FIT_XY);
i.setBackgroundResource(mGalleryItemBackground);
i.setImageBitmap(bitmap);
return i;
}
这就是我在MainActivity.class中处理它的方式:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gallery);
Gallery g = (Gallery) findViewById(R.id.gallery);
g.setAdapter(new ImageAdapter(this));
Log.i("blah","e ok");
g.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
// mBitmap = ImageAdapter.mImageIds[position];
// mZoomView = (ImageZoomView)findViewById(R.id.zoomview);
// mZoomView.setZoomState(mZoomControl.getZoomState());
// mZoomView.setImage(mBitmap);
// Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show();
}
});
如您所见,我尝试了一些操作,但是我的应用始终崩溃。 :(这里的任何帮助将不胜感激。
您应该在getView
方法中创建ImageZoomView
,假设ImageZoomView是您自己的子类,该子类是ImageView小部件的子类。
我处理它们的方式是通过对Gallery进行子类化,并覆盖OnScroll,OnFling和OnTouch,将事件提供给scaledetector并将它们发送给超类(当图像位于图像边缘时是im),而不是将图像转换为im。 请记住,这仍在进行中,但这是我目前最需要的解决方案。
又可以,但是很“古怪”。
private class ScaleListener extends
ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor = detector.getScaleFactor();
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
Log.d(TAG, "" + mScaleFactor);
scale(mScaleFactor, detector.getFocusX(), detector.getFocusY());
return true;
}
}
和
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (matrix == null)
matrix = new Matrix();
matrix.set(getSelectedImageView().getImageMatrix());
} else if (event.getAction() == MotionEvent.ACTION_UP
&& event.getPointerCount() == 0) {
scrolling = 0;
}
mScaleDetector.onTouchEvent(event);
mGestureDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
和
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
if (mScaleDetector.isInProgress()) {
scrolling = 0;
return true;
} else if (isAtRightEdge() && distanceX > 1) {
matrix.postTranslate(0, -distanceY);
getSelectedImageView().setImageMatrix(matrix);
scrolling += distanceX;
return super.onScroll(e1, e2, distanceX, distanceY);
} else if (isAtLeftEdge() && distanceX < -1) {
matrix.postTranslate(0, -distanceY);
getSelectedImageView().setImageMatrix(matrix);
scrolling += distanceX;
return super.onScroll(e1, e2, distanceX, distanceY);
} else {
if (scrolling < 0.1 && scrolling > -0.1) {
matrix.postTranslate(-distanceX, -distanceY);
getSelectedImageView().setImageMatrix(matrix);
return false;
} else {
matrix.postTranslate(0, -distanceY);
getSelectedImageView().setImageMatrix(matrix);
scrolling += distanceX;
return super.onScroll(e1, e2, distanceX, distanceY);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.