Перемещение изображения - различное поведение в программной и XML-реализации

1

Моя цель состоит в том, чтобы перемещать изображение без изображения на землю, и поэтому я следовал этому руководству: http://www.zdnet.com/blog/burnette/how-to-use-multi-touch-in-android-2-part-5-implementing-the-drag-gesture/1789

Если я использую его таким же образом, как это указано - Получение компонента представления по id и добавление моего touchlistener - это работает хорошо. С другой стороны, когда я создаю программу просмотра, она не перемещается.

в моей деятельности:

addProductToView(iterator.next());

в моем классе view:

public class ProductView extends ImageView{
public ProductView(Context context, Product product) {
        super(context);
        this.setBackgroundResource(R.drawable.bamboo);
        this.setScaleType(ScaleType.MATRIX);
                this.setOnTouchListener(new TouchListener());
...

сенсорный исполнитель:

public class TouchListener implements OnTouchListener{

    private static final String TAG = "Touch";
       // These matrices will be used to move and zoom image
       Matrix matrix = new Matrix();
       Matrix savedMatrix = 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 start = new PointF();
       PointF mid = new PointF();
       float oldDist = 1f;

//     @Override
//     public void onCreate(Bundle savedInstanceState) {
//        super.onCreate(savedInstanceState);
//        setContentView(R.layout.main);
//        ImageView view = (ImageView) findViewById(R.id.imageView);
//        view.setOnTouchListener(this);
//     }

       @Override
       public boolean onTouch(View v, MotionEvent event) {
          ImageView view = (ImageView) v;

          // Dump touch event to log
          dumpEvent(event);

//        // Handle touch events here...
          switch (event.getAction() & MotionEvent.ACTION_MASK) {
          case MotionEvent.ACTION_DOWN:
             savedMatrix.set(matrix);
             start.set(event.getX(), event.getY());
             Log.d(TAG, "mode=DRAG");
             mode = DRAG;
             break;
          case MotionEvent.ACTION_POINTER_DOWN:
             oldDist = spacing(event);
             Log.d(TAG, "oldDist=" + oldDist);
             if (oldDist > 10f) {
                savedMatrix.set(matrix);
                midPoint(mid, event);
                mode = ZOOM;
                Log.d(TAG, "mode=ZOOM");
             }
             break;
          case MotionEvent.ACTION_UP:
          case MotionEvent.ACTION_POINTER_UP:
             mode = NONE;
             Log.d(TAG, "mode=NONE");
             break;
          case MotionEvent.ACTION_MOVE:
             if (mode == DRAG) {
                // ...
                matrix.set(savedMatrix);
                matrix.postTranslate(event.getX() - start.x,
                      event.getY() - start.y);
             }
             else if (mode == ZOOM) {
                float newDist = spacing(event);
                Log.d(TAG, "newDist=" + newDist);
                if (newDist > 10f) {
                   matrix.set(savedMatrix);
                   float scale = newDist / oldDist;
                   matrix.postScale(scale, scale, mid.x, mid.y);
                }
             }
             break;
          }

          view.setImageMatrix(matrix);
          return true; // indicate event was handled
       }

       /** Show an event in the LogCat view, for debugging */
       private void dumpEvent(MotionEvent event) {
          String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
                "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
          StringBuilder sb = new StringBuilder();
          int action = event.getAction();
          int actionCode = action & MotionEvent.ACTION_MASK;
          sb.append("event ACTION_").append(names[actionCode]);
          if (actionCode == MotionEvent.ACTION_POINTER_DOWN
                || actionCode == MotionEvent.ACTION_POINTER_UP) {
             sb.append("(pid ").append(
                   action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
             sb.append(")");
          }
          sb.append("[");
          for (int i = 0; i < event.getPointerCount(); i++) {
             sb.append("#").append(i);
             sb.append("(pid ").append(event.getPointerId(i));
             sb.append(")=").append((int) event.getX(i));
             sb.append(",").append((int) event.getY(i));
             if (i + 1 < event.getPointerCount())
                sb.append(";");
          }
          sb.append("]");
          Log.d(TAG, sb.toString());
       }

       /** Determine the space between the first two fingers */
       private float spacing(MotionEvent event) {
          float x = event.getX(0) - event.getX(1);
          float y = event.getY(0) - event.getY(1);
          return FloatMath.sqrt(x * x + y * y);
       }

       /** Calculate the mid point of the first two fingers */
       private void midPoint(PointF point, MotionEvent event) {
          float x = event.getX(0) + event.getX(1);
          float y = event.getY(0) + event.getY(1);
          point.set(x / 2, y / 2);
       }
}

Я получаю информацию журнала о том, что обнаружено перетаскивание, но я не вижу никаких изменений. Что я ошибся с объявлением компонента моего изображения? Мне нужно объявить его программным.

Теги:
imageview
multi-touch

1 ответ

0

Я предполагаю, что вам не хватает свойства clickview для clickable. Когда мы определяем изображение, мы должны указать свойство clickable для щелчка, перемещения, касания. Вы реализовали его при программной загрузке?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню