进阶一、------自定义view

    点击打开链接--大神链接一

    点击打开链接--大神链接二

    介绍很多控件在编写代码是感觉不是很好,想要更方便就要学会自定义View,自定义View可以是组合、继承、自绘控件,在这里,就有一篇较简单的自定义View

        效果图:
   效果介绍:自定义控件为圆形且为红色,随着手指的滑动而滑动
    效果分析:  
                    1.  

创建自定义View类BallView,自定义属性:ball_size

                    2. 在values下

新建attrs.xml文件,自定义属性ball_size,可以在布局文件里设置小球的大小

                    3. 

 实现onDraw()方法;

                        1) 用canvas将屏幕设为白色

                        2) 设置画笔颜色为红色

                        3) 绘制小圆作为小球,半径通过自定义属性设置

                    4. 实现onTouchEvent方法,处理触摸事件;

                        1) 实现MotionEvent.ACTION_DOWN,记录按下的x,y坐标

                        2) 实现MotionEvent.ACTION_MOVE 记录移动的x,y坐标

                        3) 实现MotionEvent.ACTION_UP 记录抬起的x,y坐标

                        4) 使用 postInvalidate()方法实现重绘小球,跟随手指移动

    代码实现:

           注释:attrs在values下


         
 <com.b.zzz.views.BallView
        android:layout_width="100dp"
        android:layout_height="100dp"
        attrs:ball_size="20sp"/>
public class BallView extends View {

    private Paint mpaint;
    private TypedArray ta;
    private float dimension;


    private int l;
    private int r;
    private int t;
    private int b;
    private int lastX;
    private int lastY;

    public BallView(Context context) {
        this(context, null);
    }

    public BallView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BallView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //自定义ballsize
        ta = context.obtainStyledAttributes(attrs, R.styleable.BallView, defStyleAttr, 0);
        dimension = ta.getDimension(R.styleable.BallView_ball_size, 40);

        //自定义画笔
        mpaint = new Paint(Paint.ANTI_ALIAS_FLAG);//抗锯齿
        mpaint.setColor(Color.RED);//颜色
        mpaint.setStrokeWidth(3);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //用canvas将屏幕设为白色
        canvas.drawColor(Color.WHITE);

        //绘制小圆作为小球,半径通过自定义属性设置
        canvas.drawCircle(100, 100, dimension, mpaint);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                //获取开始的坐标
                lastX = (int) event.getRawX();
                lastY = (int) event.getRawY();
                break;

            case MotionEvent.ACTION_MOVE:
                //获取移动时候的坐标
                //减去手指按下时候的坐标
                //得到移动的间距
                int mX = (int) event.getRawX();
                int dx = mX - lastX;
                int mY = (int) event.getRawY();
                int dy = mY - lastY;
                //将间距,加到原来的坐标(上下左右)
                int l = getLeft();
                int r = getRight();
                int t = getTop();
                int b = getBottom();
                l = l + dx;
                r = r + dx;
                t = t + dy;
                b = b + dy;
                //判断是否溢出屏幕
//				if (l<0){
//					l = 0;
//					r = getWidth();
//				}
                //重新赋值给布局
                layout(l, t, r, b);//规定了View的位置
                //将lastX,lastY重新赋值
                lastX = mX;
                lastY = mY;
                break;
            case MotionEvent.ACTION_UP:

                break;
        }
        return true;//返回true代表自己处理事件
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值