Android自定义View过程解析

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中定义元素值进行曝光相关联。

以上就是本文的全部内容,希望对大家的学习有所帮助。

时间: 2024-10-15 16:14:29

Android自定义View过程解析的相关文章

Android自定义View过程解析_Android

Android自定义的view,主要是继承view,然后实现ondraw这个方法,来进行绘制. 1. 编写自己的自定义view 2. 加入逻辑线程 3. 提取和封装自定义view 4. 利用xml中定义样式来影响显示效果 一.编写自定义的view1.在xml中使用自己的view <!-- 可以使用view的公共属性,例如背景 --> <com.niuli.view.MyView android:layout_width="match_parent" android:l

Android自定义View绘制的方法及过程(二)

上一篇<Android 自定义View(一) Paint.Rect.Canvas介绍>讲了最基础的如何自定义一个View,以及View用到的一些工具类.下面讲下View绘制的方法及过程 public class MyView extends View { private String TAG = "--------MyView"; private int width, height; public MyView(Context context, AttributeSet a

Android自定义View之圆形进度条总结

最近撸了一个圆形进度条的开源项目,算是第一次完完整整的使用自定义 View .在此对项目开发思路做个小结,欢迎大家 Star 和 Fork. 该项目总共实现了三种圆形进度条效果 CircleProgress:圆形进度条,可以实现仿 QQ 健康计步器的效果,支持配置进度条背景色.宽度.起始角度,支持进度条渐变 DialProgress:类似 CircleProgress,但是支持刻度 WaveProgress:实现了水波纹效果的圆形进度条,不支持渐变和起始角度配置,如需此功能可参考 CircleP

Android自定义View研究--View中的原点坐标和XML中布局自定义View时View触摸原点问题

这里只做个汇总~.~独一无二 文章出处:http://blog.csdn.net/djy1992/article/details/9715047 Android自定义View研究--View中的原点坐标相关问题 我们自定义了View,但是有没想过一个问题,就是View中的(0,0)坐标,也就是原点坐标在哪??我们是不是有时候很困惑,接下来我们就来研究View中的原点坐标相关的问题. 一.new DuView时View的原点 我们通过从View中绘制一条从原点到右下角的线来看看这个View中的原点

Android自定义View——自定义搜索框(SearchView)

概述 在Android开发中,当系统数据项比较多时,常常会在app添加搜索功能,方便用户能快速获得需要的数据.搜索栏对于我们并不陌生,在许多app都能见到它,比如豌豆荚 在某些情况下,我们希望我们的自动补全信息可以不只是纯文本,还可以像豌豆荚这样,能显示相应的图片和其他数据信息,因此Android给我们提供的AutoCompleteTextView往往就不够用,在大多情况下我们都需要自己去实现搜索框. 分析 根据上面这张图,简单分析一下自定义搜索框的结构与功能,有  1. 搜索界面大致由三部门组

Android自定义View实现左右滑动选择出生年份_Android

自定义view的第三篇,模仿的是微博运动界面的个人出生日期设置view,先看看我的效果图: 支持设置初始年份,左右滑动选择出生年份,对应的TextView的值也会改变.这个动画效果弄了好久,感觉还是比较生硬,与微博那个还是有点区别.大家有改进的方案,欢迎一起交流. 自定义View四部曲,这里依旧是这个套路,看看怎么实现的. 1.自定义view的属性: 在res/values/ 下建立一个attrs.xml , 在里面定义我们的属性以及声明我们的整个样式. <?xml version="1.

Android自定义view实现阻尼效果的加载动画_Android

效果: 需要知识: 1. 二次贝塞尔曲线 2. 动画知识 3. 基础自定义view知识 先来解释下什么叫阻尼运动 阻尼振动是指,由于振动系统受到摩擦和介质阻力或其他能耗而使振幅随时间逐渐衰减的振动,又称减幅振动.衰减振动.[1] 不论是弹簧振子还是单摆由于外界的摩擦和介质阻力总是存在,在振动过程中要不断克服外界阻力做功,消耗能量,振幅就会逐渐减小,经过一段时间,振动就会完全停下来.这种振幅随时间减小的振动称为阻尼振动.因为振幅与振动的能量有关,阻尼振动也就是能量不断减少的振动.阻尼振动是非简谐运

Android自定义View实现水面上涨效果_Android

实现效果如下: 实现思路: 1.如何实现圆中水面上涨效果:利用Paint的setXfermode属性为PorterDuff.Mode.SRC_IN画出进度所在的矩形与圆的交集实现 2.如何水波纹效果:利用贝塞尔曲线,动态改变波峰值,实现"随着进度的增加,水波纹逐渐变小的效果" 话不多说,看代码. 首先是自定义属性值,有哪些可自定义属性值呢? 圆的背景颜色:circle_color,进度的颜色:progress_color,进度显示文字的颜色:text_color,进度文字的大小:tex

Android自定义View之酷炫圆环(二)_Android

先看下最终的效果 静态: 动态: 一.开始实现 新建一个DoughnutProgress继承View public class DoughnutProgress extends View { } 先给出一些常量.变量以及公共方法的代码,方便理解后面的代码     private static final int DEFAULT_MIN_WIDTH = 400; //View默认最小宽度 private static final int RED = 230, GREEN = 85, BLUE =