#java #android #gallery #pinch
#java #Android #Галерея #ущипнуть
Вопрос:
У меня есть галерея изображений, и я пытаюсь включить для нее точечное увеличение. По отдельности они работают просто отлично. Проблема в том, что я ни за что на свете не смогу связать их вместе! Я пытался привязать ImageZoomView в ImageAdapter, но безрезультатно. Должен ли я попробовать сделать это, когда пользователь нажимает на изображение? Есть ли у кого-нибудь другие идеи? Это код в ImageAdapter.class которая возвращает элементы галереи:
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();
}
});
Как вы можете видеть, я кое-что пробовал, но мое приложение всегда вылетает. Здесь мы будем признательны за любую помощь.
Ответ №1:
Вы должны создать галерею ImageZoomView
в getView
методе, предполагая, что ImageZoomView является виджетом вашего собственного подкласса ImageView widget.
Комментарии:
1. Я пытался использовать ImageZoomView вместо ImageView, но он разбился.
![]()
2. Затем поместите отчет о сбое в свой вопрос
3. Хорошо, мне удалось использовать ImageZoomView вместо простого ImageView. Точечный зум работает отлично, но теперь, хотя я вижу рамку галереи в фоновом режиме, я не могу использовать свайп для перемещения по всем изображениям. бьется головой о стену
4. У вас должна быть отдельная галерея и вид основного изображения, как в mobiforge.com/designing/story /…
5. Я хотел бы это сделать, но я должен реализовать точечное увеличение непосредственно поверх галереи : (
Ответ №2:
Я справился с этим, создав подкласс gallery и переопределив OnScroll, onFling и onTouch, которые передают события в scaledetector и отправляют их в суперкласс, когда я на краю изображений, и переводят изображение, когда я нет. Имейте в виду, что эта работа все еще продолжается, но на данный момент это самое близкое к рабочему решение, которое у меня есть.
Иначе это работает, но это «причудливо».
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
amp;amp; 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() amp;amp; distanceX > 1) {
matrix.postTranslate(0, -distanceY);
getSelectedImageView().setImageMatrix(matrix);
scrolling = distanceX;
return super.onScroll(e1, e2, distanceX, distanceY);
} else if (isAtLeftEdge() amp;amp; distanceX < -1) {
matrix.postTranslate(0, -distanceY);
getSelectedImageView().setImageMatrix(matrix);
scrolling = distanceX;
return super.onScroll(e1, e2, distanceX, distanceY);
} else {
if (scrolling < 0.1 amp;amp; 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);
}
}
}