当前位置: 代码迷 >> Android >> 请问layout的移动有关问题
  详细解决方案

请问layout的移动有关问题

热度:26   发布时间:2016-04-28 01:01:17.0
请教layout的移动问题
大家好,我想实现这样的效果:
在一个layout中有4个Button和一个surfaceview,  当按下这个layout中任意地方时,可以在界面上任意移动.
当点击Button时,相应执行动作.


因为要移动一个layout,我就重写了viewgroup,然后在viewgroup中放4个Button,布局好, 在onTouchEvent事件中判断是否移动, 然后updateViewLayout(),

现在的问题是:
我每次按下时,就出错, 提示说:05-10 AndroidRuntime(21357): java.lang.IllegalArgumentException: Given view not a child of [email protected]


请问下为什么,谢谢了



我的代码是:
public class snoViewGroup extends ViewGroup {

///Context mContext;
public static int TOOL_BAR_HIGH = 0;
public static WindowManager.LayoutParams params = new WindowManager.LayoutParams();
private float startX;
private float startY;
private float x;
private float y;

public snoViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
      
        int Height=0;
        final int count = getChildCount();
        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
         
            if (child.getVisibility() != View.GONE) {
         Log.i("sno","snoviewgroup--!= View.GONE:"+count);
                final int childWidth = child.getMeasuredWidth(); 
                final int childHeight= child.getMeasuredHeight();
                child.layout(0, 2+Height, childWidth,
                 childHeight); 
                Height += childHeight;
            }
        }
    }
   @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        final int count = getChildCount();
        for (int i = 0; i < count; i++) {
            getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
        }       
    }
   public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (getChildCount() == 0)
            return false;
        return true;
    }
   @Override
public boolean onTouchEvent(MotionEvent event) {
// 触摸点相对于屏幕左上角坐标
x = event.getRawX();
y = event.getRawY() - TOOL_BAR_HIGH;
Log.d("sno","------X: " + x + "------Y:" + y);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
updatePosition();
break;
case MotionEvent.ACTION_UP:
updatePosition();
startX = startY = 0;
break;
}
return true;
}
private void updatePosition() {
// View的当前位置
params.x = (int) (x - startX);
params.y = (int) (y - startY);
updateViewLayout(this, params);
}

}

 

------解决思路----------------------
看你代码头疼,自己大概写的你功能~你看看是不是你那意思~

package com.hahaha.hhaha;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class MainActivity extends Activity {
RelativeLayout rl;
int x,y,mx,my;
Button btn01;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn01 = (Button) findViewById(R.id.btn01);
btn01.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "点死我了", 100).show();
}
});
rl = (RelativeLayout) findViewById(R.id.rl);
rl.setOnTouchListener(new OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent e) {
// TODO Auto-generated method stub
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
x = (int) e.getX();
y = (int) e.getY();
break;

case MotionEvent.ACTION_UP:

break;

case MotionEvent.ACTION_MOVE:
mx = (int) (e.getRawX() - x);
my =(int) (e.getRawY() - y);
v.layout(mx, my, mx + v.getWidth(), my + v.getHeight());
break;
default:
break;
}
return true;
}
});
}

}