Android自定义View过程解析
程序员文章站
2023-12-22 14:45:58
android自定义的view,主要是继承view,然后实现ondraw这个方法,来进行绘制。
1. 编写自己的自定义view
2. 加入逻...
android自定义的view,主要是继承view,然后实现ondraw这个方法,来进行绘制。
- 1. 编写自己的自定义view
- 2. 加入逻辑线程
- 3. 提取和封装自定义view
- 4. 利用xml中定义样式来影响显示效果
一、编写自定义的view
1.在xml中使用自己的view
<!-- 可以使用view的公共属性,例如背景 --> <com.niuli.view.myview android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffff00" />
2.通过继承view,然后实现ondraw来实现方法
public class myview extends view { bitmap bitmap; public myview(context context) { super(context); /** * getresources()可以获取当前资源内的资源 */ 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); } /** * 绘制是通过canvas来承载,其就相当于一块画布 * 更多的学习将在不断的做小东西中更新 */ @override protected void ondraw(canvas canvas) { super.ondraw(canvas); /** * paint相当于一只画笔,可以画文字,几何图形,bit图片等 */ paint paint = new paint(); //设置绘制的颜色,是否空心之类的都是对画笔的设计 paint.setcolor(color.blue); //绘画文字 paint.settextsize(30); canvas.drawtext("这是一个自定义view", 0, 30, paint); //绘画直线 canvas.drawline(0, 60, 100, 60, paint); //绘画圆角矩形方法之一 //设置空心 paint.setstyle(paint.getstyle().stroke); rectf rec = new rectf(0, 90, 100, 190); canvas.drawroundrect(rec, 20, 20, paint); //绘制图片 canvas.drawbitmap(bitmap, 0, 350, paint); } }
效果
二、自定义的view+线程的使用控制
绘制文字,和圆形,通过线程控制使得其能在屏幕中移动
public class myviewtwo extends view { //定义画笔 private paint paint = new paint(); private int x; private float sweepangle; private control thread; private random random = new random(); public myviewtwo(context context, attributeset attrs) { super(context, attrs); } public myviewtwo(context context) { super(context); } @override protected void ondraw(canvas canvas) { paint.settextsize(80); //绘制文字 canvas.drawtext("七夕快乐", x, 70, paint); //绘制图形 rectf rect = new rectf(0 ,80 ,100, 160); canvas.drawarc(rect, 0, sweepangle, true, paint); //启动线程 if (thread ==null) { thread = new control(); thread.start(); } } public class control extends thread{ @override public void run() { while(true){ x +=3; sweepangle++; if (x>getwidth()) { x = (int) (0 - paint.measuretext("七夕快乐")); } //控制圆的的旋转 if (sweepangle>360) { sweepangle = 0; } //设置画笔颜色 paint.setargb(255, random.nextint(255), random.nextint(255), random.nextint(255)); //相当于刷新画布 postinvalidate(); try { sleep(30); } catch (interruptedexception e) { e.printstacktrace(); } } } }
效果
三、封装移动程序,模块化思想
封装主要是使用抽象方法,子类继承后只要实现这些方法即可运行起来,大大简化了程序
public abstract class myviewtwo extends view { private control thread; public myviewtwo(context context, attributeset attrs) { super(context, attrs); } public myviewtwo(context context) { super(context); } //封装,构造画面,子类继承后需要重写 protected abstract void drawsub(canvas canvas); @override protected final void ondraw(canvas canvas) { //启动线程 if (thread ==null) { thread = new control(); thread.start(); }else { drawsub(canvas); } } //封装移动方法,子类继承后需要重写 protected abstract void move(); public class control extends thread{ @override public void run() { while(true){ move(); //相当于刷新画布 postinvalidate(); try { sleep(30); } catch (interruptedexception e) { e.printstacktrace(); } } } } }
四、使用xml中定义样式影响显示效果
1、第一步就是在value文件夹中建立自己的样式文件
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="numtext"> <attr name="linenum" format="integer"/> <attr name="xscroll" format="boolean" /> </declare-styleable> </resources>
2、xml中先要加入命名空间,然后就可以直接使用属性
<framelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:nt="http://schemas.android.com/apk/res/com.jikexueyuan.myview" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" > <com.jikexueyuan.myview.v4.numtext android:layout_width="match_parent" android:layout_height="match_parent" nt:linenum="6" nt:xscroll="true"/> </framelayout>
3、代码中要有相应的解析xml中定义的这个元素
public numtext(context context, attributeset attrs) { super(context, attrs); typedarray ta = context.obtainstyledattributes(attrs, r.styleable.numtext); linenum = ta.getint(r.styleable.numtext_linenum, 1); xscroll = ta.getboolean(r.styleable.numtext_xscroll, false); ta.recycle(); }
主要就是利用以上方法和xml中定义元素值进行曝光相关联。
以上就是本文的全部内容,希望对大家的学习有所帮助。