通过onTouch移动ImageView的() [英] Move ImageView through onTouch()

查看:100
本文介绍了通过onTouch移动ImageView的()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 AbsoluteLayout ,我想打动我的的ImageView 解决此布局低谷我的触摸点,看看我的code,一切都很好,当我接触任何积分,积分将被保存在一个变量,但的ImageView 已消失,任何想法?

我的XML布局:
    

 < ImageView的
        机器人:ID =@ + ID / FirstBall
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_x =59dp
        机器人:layout_y =446dp
        机器人:SRC =@绘制/ redball/>< / AbsoluteLayout>

我的codeS:

  FstBall =(ImageView的)findViewById(R.id.FirstBall);
FstBall.setOnTouchListener(新OnTouchListener(){
    @覆盖
    公共布尔onTouch(视图V,MotionEvent事件){
    浮X = event.getX();
    浮Y = event.getY();
    INT行动= event.getAction();
    浮FnlResX = 0;
    浮FnlResY = 0;
    如果(动作== MotionEvent.ACTION_MOVE){
    FnlResX = X;
    FnlResY = Y;
    INT TST1 =(INT)FnlResX;
    INT TST2 =(INT)FnlResY;
    FstBall.scrollBy(TST1,TST2);
    }
    返回true;
    }
    });


解决方案

这是可以预料到行为,因为你只是滚动窗口,而不是实际移动视图。正确的方法将覆盖布局的onTouchEvent方法。

 公共类MyAbsoluteLayout扩展AbsoluteLayout {   私有静态最后弦乐TAG = MyAbsoluteLayout.class.getSimpleName();   私人诠释mDepth;   @覆盖
   公共布尔onTouchEvent(MotionEvent事件){
        最后查看孩子= getChildAt(mDepth);
        如果(孩子== NULL){
            Log.e(TAG,没有儿童在选定的深度);
            返回super.onTouchEvent(事件);
        }
        最后ViewGroup.MarginLayoutParams PARAMS =(ViewGroup.MarginLayoutParams)child.getLayoutParams();
        params.leftMargin = event.getX();
        params.topMargin = event.getY();
        child.setLayoutParams(PARAMS);
        返回super.onTouchEvent(事件);
    }    公共无效setMovingChildDepth(最终诠释深度){
       mDepth =深度;
    }
}公共类MyActivity延伸活动{    公共无效的onCreate(捆绑数据){
        super.onCreate(数据);        最后MyAbsoluteLayout布局=新MyAbsoluteLayout(本);
        最后ViewGroup.MarginLayoutParams的LayoutParams =新ViewGroup.MarginLayoutParams(FILL_PARENT,FILL_PARENT);
        layout.setLayoutParams(的LayoutParams);        最后ImageView的ImageView的=新ImageView的(本);
        最后ViewGroup.MarginLayoutParams viewParams =新ViewGroup.MarginLayoutParams(100,100);
        params.leftMargin = 100;
        params.topMargin = 100;
        imageView.setBackgroundDrawable(yourDrawable);
        layout.addView(ImageView的,则params);        layout.setMovingChildDepth(layout.indexOfChild(ImageView的));        的setContentView(布局);
    }
}

I've a AbsoluteLayout and I wanna move my ImageView around this Layout trough my touch points , Look at my code , Everything is fine when I touch any points, Points are saved in a variable , but ImageView was disappear , Any Ideas?

My XML Layout :

    <ImageView
        android:id="@+id/FirstBall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="59dp"
        android:layout_y="446dp"
        android:src="@drawable/redball" />

</AbsoluteLayout>

My Codes:

FstBall=(ImageView)findViewById(R.id.FirstBall);
FstBall.setOnTouchListener(new OnTouchListener(){
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    float x = event.getX();
    float y = event.getY();
    int action = event.getAction();
    float FnlResX = 0;
    float FnlResY = 0;
    if (action == MotionEvent.ACTION_MOVE){
    FnlResX = x;
    FnlResY = y;
    int tst1 = (int) FnlResX;
    int tst2= (int) FnlResY;
    FstBall.scrollBy(tst1, tst2);
    }
    return true;
    }
    });

解决方案

That's a behavior to be expected, given that you just scroll the window instead of actually moving the view. The right way will be to override the onTouchEvent method of your layout.

public class MyAbsoluteLayout extends AbsoluteLayout{

   private static final String TAG = MyAbsoluteLayout.class.getSimpleName();

   private int mDepth;

   @Override
   public boolean onTouchEvent(MotionEvent event){
        final View child = getChildAt(mDepth);
        if(child == null){
            Log.e(TAG, "no child at selected depth");
            return super.onTouchEvent(event);
        }
        final ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)   child.getLayoutParams();
        params.leftMargin = event.getX();
        params.topMargin = event.getY();
        child.setLayoutParams(params);
        return super.onTouchEvent(event);
    }

    public void setMovingChildDepth(final int depth){
       mDepth = depth;
    }
}

public class MyActivity extends Activity{

    public void onCreate(Bundle data){
        super.onCreate(data);

        final MyAbsoluteLayout layout = new MyAbsoluteLayout(this);
        final ViewGroup.MarginLayoutParams layoutParams = new ViewGroup.MarginLayoutParams(FILL_PARENT,FILL_PARENT);
        layout.setLayoutParams(layoutParams);

        final ImageView imageView = new ImageView(this);
        final ViewGroup.MarginLayoutParams viewParams = new ViewGroup.MarginLayoutParams(100,100);
        params.leftMargin = 100;
        params.topMargin = 100;
        imageView.setBackgroundDrawable(yourDrawable);
        layout.addView(imageView,params);

        layout.setMovingChildDepth(layout.indexOfChild(imageView));

        setContentView(layout);
    }
}

这篇关于通过onTouch移动ImageView的()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆