自定义view,首先搞清楚各种x y坐标的含义:
1.搞清楚 top right left bottom
每一个view都会有四个点top right left bottom
top 就是view 上边距与父容器顶部的距离
right view 右边距 与父容器左边距的距离
bottom 就是view下边距 与父容器顶部的距离顶部 不是底部
left 就是view左边距与父容器左边距的点
top bottom 的值是以父容器的顶部作为参照物
left right 的值是以父容器的左边作为参照物
所以view height = bottom - top width = right - left;
×请记住 top left right bottom 是不会变的,即使你移动的view它也不会变,他们始终是view最初状态的值2.搞清楚event 的坐标event.getx event.gety 是手相对于view的坐标
evet.getrawx event.getrawy 是手相对于屏幕的坐标 你获取到移动的距离
movex = event.getx - downx downx 就是你按下时候记录的event.getx坐标
movex = event.getrawx - downx downx 就是你按下时候的event.getrawx搞清楚view的内部类中的两个方法
getX() getY() 不是event的方法 是view的方法,
x 是view左上角横坐标
y 是view左上角纵坐标
这个两个值会变化的,如果你移动view的话。- 4.view 内部类还有两个变量你需要搞清楚translationX translationY
translationX就是 与view 与left 在x轴的偏移量 x = translationX + left;
translationY就是 与view 与top的偏移量在y轴的偏移量 y = translationY+top
其中x y 就是3 提到的 view左上角的横坐标与纵坐标
搞清楚这几点,你移动view的时候就不会总是不知道从何下手了 最后附上一个view正弦曲线移动的例子作为参考:
如图:
代码如下:
public class ViewDemo1 extends View {
private float mDwonX;
private float mDownY;
private float mMoveY = 0;
private float mMoveX = 0;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
setTranslationX(mMoveX*50+200);
setTranslationY(mMoveY);
}
};
public ViewDemo1(Context context) {
super(context);
init();
}
public ViewDemo1(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ViewDemo1(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init(){
sinTrace();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
//down(event);
break;
case MotionEvent.ACTION_MOVE:
// move(event);
break;
case MotionEvent.ACTION_UP:
//up(event);
break;
}
return true;
}
private void down(MotionEvent event){
Log.e("gac","down");
mDownY = event.getRawY(); //event.getY();
mDwonX =event.getRawX(); //event.getX();
}
private void move(MotionEvent event){
Log.e("gac","getx:"+event.getX()+" gety:"+event.getY());
Log.e("gac","rawX:"+event.getRawX()+" rawY:"+event.getRawY());
Log.e("gac","x:"+getX()+" y:"+getY());
Log.e("gac","top:"+getTop()+" right:"+getRight()+ "bottom:"+getBottom()+" left:"+getLeft());
Log.e("gac","translationX:"+getTranslationX()+" transtionY:"+getTranslationY());
setTranslationX(event.getRawX() - mDwonX);
setTranslationY(event.getRawY() - mDownY);
}
private void up(MotionEvent event){
Log.e("gac","up");
}
private void sinTrace(){
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
if (mMoveY >= 1000){
mMoveY = 0;
}
mMoveX =(float) Math.sin((double) 0.1*mMoveY);
mMoveY+=0.1;
handler.sendEmptyMessage(0);
Log.e("gac","timer mMoveX:"+mMoveX+" mMoveY:"+mMoveY);
}
}, 0,10);// 设定指定的时间time,
}
}