android 自定义view 基础(一)

自定义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,

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值