自定义 View 基础和原理

课程背景:

在 Android 提供的系统控件不能满足需求的情况下,往往需要自己开发自定义 View 来满足需求,但是该如何下手呢,本课程将带你进入自定义 View 的开发过程,来了解它的一些原理。

核心内容:

1.编写自己的自定义 View
2.加入逻辑线程
3.提取和封装自定义 View
4.利用 xml 中定义样式来影响显示效果

编写自己的自定义 View(上)

本课时主要讲解最简单的自定义 View,然后加入绘制元素(文字、图形等),并且可以像使用系统控件一样在布局中使用。

本课时将要做两件事情:

编写最简单的自定义View,什么都不显示,但是有View的特性

可以显示自己的元素

本课时的知识要点包括:

最简单的自定义View,继承View

通过覆盖View的onDraw方法来实现自主显示

利用Canvas和paint来绘制显示元素(文字,几何图形等)


public class MyView extends View{
   

    private Bitmap bitmap;

    //需要添加两个构造方法(第一个在代码中使用,第二个在布局中使用)
    public MyView(Context context) {
        super(context);
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    }

    //通过View提供的onDraw方法加入绘制元素
    @Override
    protected void onDraw(Canvas canvas) {
  //Canvas可以绘制文字、集合图形、Bitmap(图片)

        //The Paint class holds the style and color information about how to draw geometries, text and bitmaps.
        Paint paint = new Paint();
        paint.setTextSize(30);//设置文字大小
        paint.setColor(0xffff0000);//通过16进制的方式设置paint的颜色,以16进制代表的颜色意义是:a,r,g,b
        /**
         * 绘制文字
         * 参数
         * text,x,y,paint
         */
        canvas.drawText("this is onDraw", 0, 30, paint);

        //绘制几何元素

        /**
         * 绘制直线
         * 参数
         * startX, startY, stopX, stopY, paint
         */
        canvas.drawLine(0, 60, 100, 60, paint);

        paint.setStyle(Style.STROKE);//设置图型样式为空心

        /**
         * 绘制矩形
         * 参数
         * left, top, right, bottom, paint
         */
        //canvas.drawRect(0, 90, 100, 190, paint);

        //另外两个绘制矩形方法
        //Rect r = new Rect(0, 90, 100, 190);
        //canvas.drawRect(r, paint);

        RectF r = new RectF(0, 90, 100, 190);
        //canvas.drawRect(r, paint);

        /**
         * 绘制圆角的矩形
         * 参数
         * rect, rx, ry, paint
         * rx, ry:代表X轴和Y轴的弧度
         */
        //canvas.drawRoundRect(r, 10, 10, paint);

        /**
         * 绘制圆形
         * 参数:cx, cy, radius, paint
         * cx, cy:圆心位置,radius半径
         */
        canvas.drawCircle(50, 270, 50, paint);


        /**
         * 绘制图片
         * 参数:bitmap, left, top, paint
         * left, top:左上坐标
         */
        canvas.drawBitmap(bitmap, 0, 350, paint);

    }
}

上面通过Paint对象可以影响绘制元素的颜色和样式信息

    <!-- 在布局中添加自定义View,该自定义View继承了系统的View所以他有系统View的一些属性 -->

    <com.example.myview.MyView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#00ff00" />

public class MainActivity extends Activity {
   

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.activity_main);

        // 在代码中实例化自定义view(通过代码的方式添加自定义view)
        setContentView(new MyView(this));
    }

}

这里写图片描述

加入逻辑线程

本课时需要让绘制的元素动起来,但是又不阻塞主线程,所以引入逻辑线程。在子线程更新 UI 是不被允许的,但是 View 提供了方法。让我们来看看吧。

本课时的背景:
怎么让元素动起来,需要什么
让元素动起来的逻辑放在哪里
逻辑怎么影响绘制
怎么让元素看起来流畅

本课时的知识要点包括:
让文字动起来,改变坐标
在线程中修改坐标(加入循环,时间睡眠)
重新绘制元素(两种方式)
线程休眠时间控制(去除逻辑处理时间)

案例效果:
这里写图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值