1

我的 Activity-Class 中有一个 ImageView 的 ArrayList,它们都应该具有相同的行为:一旦您触摸它们并将手指向右或向左移动,该 ImageView 的 x 坐标也应该移动。

public boolean onTouch(View v, MotionEvent e) {
    float origin_x = 0;
    float origin_x2 = 0;
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) v.getLayoutParams();
    switch (e.getActionMasked()) {
        case MotionEvent.ACTION_DOWN: {
            origin_x = e.getX();
            origin_x2 = lp.leftMargin;
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            float diff = e.getX()-origin_x;
            System.out.println(diff);

            lp.setMargins((int) (origin_x2+diff), lp.topMargin, 0, 0);
            v.setLayoutParams(lp);
            break;
        }
    }
    return true;
}

但是由于我只能在 ontouch-Method 中使用“View”-Object,所以我无法找出触摸了哪个 ImageView。

你知道我应该如何解决这个问题吗?

4

2 回答 2

2

好的,这个问题我很久以前就问过了 - 但由于它最近获得了很多点击甚至是赞成票,所以我决定现在回答它。

如果您想移动视图(无论是 ImageView 还是任何其他类型的视图),您可以使用我的问题帖子中的代码。将 设置marginsonTouch MotionEvent值将在RelativeLayouts.


但是,我的问题还包括如何ViewArrayList 中onTouch的-Event中找到对象。 答案也很简单:ImageViews

ArrayList<ImageView> arrList = new ArrayList<ImageView>();
/** ... **/
int keyOfView = arrList.indexOf(v);

不管vView对象还是ImageView对象。ArrayList 查找不需要从Viewto 转换ImageView,因为引用将保持不变 - 这就是在 List 中实际搜索的内容:引用。


但是,如果您(无论出于何种原因)确实需要ImageView来自View对象并且不确定是否所有对象Views实际上都是ImageView对象,那么您可以执行以下操作:

if (v instanceof ImageView) {
     ImageView i = (ImageView) v;
}

这样你就不会得到cast-errors

于 2016-01-07T22:49:24.643 回答
1

假设您只使用ImageViews 这个触摸监听器,您可以执行以下操作:

ImageView imageView = (ImageView) v;
于 2013-08-23T00:30:30.733 回答