Android自定义View控件,基本步骤

来源:互联网 发布:男生 马丁靴 知乎 编辑:程序博客网 时间:2024/05/16 01:03

使用Android创建一个自定义控件用于实现多行滚动显示文字、以及颜色的随机改变

一、新建一个Android项目,名字为DesignView

二、新建 DynamicTextLine.java

package design.cc.com.designview.design.cc.com.designview.dynamictext;import android.content.Context;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.View;/** * 创建一个抽象类,进行封装,其中 drawSub和logic方法只是在父类中进行管理,需要在子类中实现 * Created by Administrator on 2/26/2017. */public abstract class DynamicTextLine extends View {    private MyThread thread;    public DynamicTextLine(Context context) {        super(context);    }    public DynamicTextLine(Context context, AttributeSet attrs) {        super(context, attrs);    }    /**     * 加入控制元素,绘制元素通过canvas来绘制的,使用final来禁止子类来覆盖父类的方法     */    @Override    protected final void onDraw(Canvas canvas) {        drawSub(canvas);        if (thread == null) {            thread = new MyThread();            thread.start();        } else {            drawSub(canvas);        }    }    /**     * 对绘制方法进行封装     *     * @param canvas     */    protected abstract void drawSub(Canvas canvas);    /**     * 将逻辑代码进行封装     */    protected abstract void logic() ;    /**     * 需要在离开屏幕的时候讲MyThread中的死循环结束掉     */    private boolean runnning=true;    @Override    protected void onDetachedFromWindow() {        runnning=false;        super.onDetachedFromWindow();    }    /**     * 创建一个线程     */    class MyThread extends Thread {        @Override        public void run() {            while (true) {                logic();                postInvalidate();                try {                    Thread.sleep(30);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }}

三、新建属性文件attrs.xml

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="DynamicTextLine">        <attr name="lineNum" format="integer"/>    </declare-styleable></resources>

四、新建TextLine.java文件

package design.cc.com.designview.design.cc.com.designview.dynamictext;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.RectF;import android.util.AttributeSet;import java.util.Random;import design.cc.com.designview.R;/** * Created by Administrator on 2/26/2017. */public class TextLine extends DynamicTextLine {    private Paint paint = new Paint();    /**     *在资源文件attrs.xml中定义linNum属性     */    private int lineNum=0;    private float rx = 0;    private RectF rectF = new RectF(0, 60, 100, 160);    private float sweepAngel = 0;//设置区间的角度    /**     * 用于产生随机值,使得文字和圆的绘制颜色随机改变     */    Random rand = new Random();    public TextLine(Context context) {        super(context);    }    public TextLine(Context context, AttributeSet attrs) {        super(context, attrs);        //获取到样式属性中的一个列表,其中DynamicTextLine位于attra.xml中设置        TypedArray ta=context.obtainStyledAttributes(attrs, R.styleable.DynamicTextLine);        //其中DynamicTextLine_lineNum是自动生成的        lineNum=ta.getInt(R.styleable.DynamicTextLine_lineNum,1);        //解析完成后需要释放TypedArray        ta.recycle();    }    @Override    protected void drawSub(Canvas canvas) {        //  Paint paint = new Paint();        /**         * 让文字不停的滚动,需要不断文字的坐标         */        paint.setTextSize(30);   //用于设置文字的大小        canvas.drawText("This is on draw", rx, 100, paint);        /**         * 绘制几何元素         */        // canvas.drawLine(0, 60, 100, 60, paint);        //   canvas.drawRect();        /**         *动态绘制圆         */        canvas.drawArc(rectF, 0, sweepAngel, true, paint);        /**         * 通过xml文件设置属性的方式来控制显示的行数         *         */        for (int i=0;i<lineNum;i++){            canvas.drawText("什么鬼",rx,30+30*i,paint);        }    }    @Override    protected void logic() {        //view提供了在线程中重新复制的方法,postInvalidate实际上会重新调用onDraw方法        rx = rx + 10;        /**         * getWidth是view提供的方法,用户获取屏幕的宽度         */        if (rx > getWidth()) {            rx = 0 - paint.measureText("This is on draw");  //减去文字的宽度,让文字从屏幕的边缘进入        }        sweepAngel++;        if (sweepAngel > 360) {            sweepAngel = 0;        }        int r = rand.nextInt(256);  //可以取到0-255全部的值        int g = rand.nextInt(256);  //可以取到0-255全部的值        int b = rand.nextInt(256);  //可以取到0-255全部的值        paint.setARGB(255, r, g, b);  //四个参数分别代表透明度、红绿蓝    }}

五、在activity_main文件中添加控件

 <design.cc.com.designview.design.cc.com.designview.dynamictext.TextLine        android:layout_width="match_parent"        android:layout_height="match_parent"        app:lineNum="3"/>

其中lineNum代表同时滚动的文字的数目




源码地址:http://download.csdn.net/detail/lrici/9764565

0 0
原创粉丝点击