移动 imageview - 编程和 xml 实现中的不同行为

发布于 2024-11-09 07:38:08 字数 5311 浏览 0 评论 0原文

我的目的是在地面上自由移动图像视图,因此我遵循了本教程: http://www.zdnet.com/blog/burnette/how-to-use-multi-touch-in-android-2-part-5-implementing-the-drag-gesture/1789

如果我按照那里声明的相同方式使用它 - 通过 id 获取视图组件并添加我的触摸监听器 - 它效果很好。另一方面,当我以编程方式创建视图时,它不会移动。

在我的活动中:

addProductToView(iterator.next());

在我的视图类中:

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);
       }
}

我收到检测到拖动的日志信息,但我看不到任何变化。我的图像视图组件的声明出了什么问题?我需要将其声明为程序化的。

My purpose is to move an imageview free on the ground and therefore i followed this tutorial:
http://www.zdnet.com/blog/burnette/how-to-use-multi-touch-in-android-2-part-5-implementing-the-drag-gesture/1789

If I use it the same way declared there - Getting the view component by id and adding my touchlistener - it works good. On the other side when I create the view programmatic it doesn't move.

in my activity:

addProductToView(iterator.next());

in my viewclass:

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());
...

the 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);
       }
}

I receive the log info's that a drag is detected but I can't see any change. What did I wrong with the declaration of my image view component? I need to declare it programmatic.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

南城追梦 2024-11-16 07:38:08

我猜你缺少 imageview 的可点击属性。当我们定义imageview时,我们要指定点击、移动、触摸的clickable属性。
您是否已在程序加载上实现了它?

I am guessing you are missing the clickable property of the imageview. When we define imageview, we have to specified the clickable property for clicking, moving, touch.
Did you have implement it on programatic loading?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文