自定义View实例——下雨天画面(通过布局文件.xml中的自定义属性来设值)
2016-03-13 15:08
429 查看
AndroidManifest.xml
activity_main2.xml
res/value/attrs.xml(新建的资源文件)
com.cctvjiatao.rainview.v2.BaseView
com.cctvjiatao.rainview.v2.RainItem
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.cctvjiatao.rainview" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity2" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>com.cctvjiatao.rainview.MainActivity2
package com.cctvjiatao.rainview; import android.app.Activity; import android.os.Bundle; public class MainActivity2 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); } }
activity_main2.xml
<pre name="code" class="html"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:jiatao = "http://schemas.android.com/apk/res/com.cctvjiatao.rainview" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.cctvjiatao.rainview.MainActivity" > <com.cctvjiatao.rainview.v3.ManyRain android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#ff000000" jiatao:rainNum = "100" jiatao:size = "100" jiatao:rainColor = "0xffffffff" jiatao:randColor = "false" /> </RelativeLayout>
res/value/attrs.xml(新建的资源文件)
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="RainView"> <attr name="rainNum" format="integer"/> <attr name="size" format="integer"/> <attr name="rainColor" format="integer"/> <attr name="randColor" format="boolean"/> </declare-styleable> </resources>
com.cctvjiatao.rainview.v2.BaseView
<pre name="code" class="java">package com.cctvjiatao.rainview.v2; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.View; /** * @作者: jiatao * @修改时间:2016-3-13 下午12:23:39 * @包名:com.cctvjiatao.rainview.v2 * @文件名:BaseView.java * @版权声明:www.cctvjiatao.com * @功能: 自定义View的封装类 */ public abstract class BaseView extends View { private DrawThread thread; private boolean isRunning = true; private long sleepTime = 30; public BaseView(Context context, AttributeSet attrs) { super(context, attrs); } public BaseView(Context context) { super(context); } protected abstract void drawSub(Canvas canvas); protected abstract void drawLogic(); protected abstract void init(); @Override protected final void onDraw(Canvas canvas) { if (thread == null) { thread = new DrawThread(); thread.start(); } else { drawSub(canvas); } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); isRunning = false; } class DrawThread extends Thread { @Override public void run() { init(); while (isRunning) { drawLogic(); postInvalidate(); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
com.cctvjiatao.rainview.v2.RainItem
</pre><pre name="code" class="java">package com.cctvjiatao.rainview.v2; import java.util.Random; import android.graphics.Canvas; import android.graphics.Paint; /** * @作者: jiatao * @修改时间:2016-3-13 下午12:33:39 * @包名:com.cctvjiatao.rainview.v2 * @文件名:RainItem.java * @版权声明:www.cctvjiatao.com * @功能: 雨滴的封装类 */ public class RainItem { private int width, height; private float startX, startY, stopX, stopY, sizeX, sizeY; private float speed;// 可控制速度 private Random random; private Paint paint = new Paint(); private int size = 20; private int color ; private boolean randColor = false;; public RainItem(int width, int height) { this.width = width; this.height = height; init(); } public RainItem(int width, int height, int size) { this.size = size; this.width = width; this.height = height; init(); } public RainItem(int width, int height, int size, int color) { this.color = color; this.size = size; this.width = width; this.height = height; init(); } public RainItem(int width, int height, int size, int color, boolean randColor) { this.randColor = randColor; this.color = color; this.size = size; this.width = width; this.height = height; init(); } public RainItem(int width, int height, int size, int color, boolean randColor, float speed) { this.randColor = randColor; this.color = color; this.size = size; this.speed = speed; this.width = width; this.height = height; init(); } private void init() { random = new Random(); sizeX = 1 + random.nextInt(size / 2); sizeY = 10 + random.nextInt(size); startX = random.nextInt(width); startY = random.nextInt(height); stopX = startX + sizeX; stopY = startY + sizeY; speed = 0.2f + random.nextFloat(); paint = new Paint(); if (randColor) { int r = random.nextInt(256); int g = random.nextInt(256); int b = random.nextInt(256); paint.setARGB(255, r, g, b); } else { paint.setColor(color); } } public void draw(Canvas canvas) { canvas.drawLine(startX, startY, stopX, stopY, paint); } public void move() { startX += sizeX * speed; stopX += sizeX * speed; startY += sizeY * speed; stopY += sizeY * speed; if (startY > height) { init(); } } }com.cctvjiatao.rainview.v3.ManyRain
<pre name="code" class="java">package com.cctvjiatao.rainview.v3; import java.util.ArrayList; import com.cctvjiatao.rainview.R; import com.cctvjiatao.rainview.v2.BaseView; import com.cctvjiatao.rainview.v2.RainItem; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.util.AttributeSet; /** * @作者: jiatao * @修改时间:2016-3-13 下午14:33:39 * @包名:com.cctvjiatao.rainview.v2 * @文件名:ManyRain.java * @版权声明:www.cctvjiatao.com * @功能: 下雨的执行类,通过布局文件.xml中的自定义属性来设值 */ public class ManyRain extends BaseView { private ArrayList<RainItem> list = new ArrayList<RainItem>(); private int rainNum;// 雨滴的数量 private int size;// 移动的距离 private int rainColor;// 画笔的初始颜色 private boolean randColor; // 是否变色 public ManyRain(Context context, AttributeSet attrs) { super(context, attrs); TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RainView); rainNum = ta.getInteger(R.styleable.RainView_rainNum, 80); size = ta.getInteger(R.styleable.RainView_size, 20); rainColor = ta.getInteger(R.styleable.RainView_rainColor, 0xffffffff); randColor = ta.getBoolean(R.styleable.RainView_randColor, false); ta.recycle(); } public ManyRain(Context context) { super(context); } @Override protected void drawSub(Canvas canvas) { for (RainItem item : list) { item.draw(canvas); } } @Override protected void drawLogic() { for (RainItem item : list) { item.move(); } } @Override protected void init() { for (int i = 0; i < rainNum; i++) { RainItem item = new RainItem(getWidth(), getHeight(), size, rainColor, randColor); list.add(item); } } }
相关文章推荐
- 再谈Mysql中limit后的注入
- 设计模式之策略模式(Strategy)
- poj-2478 Farey Sequence(dp,欧拉函数)
- 简单的四则运算(续)
- discuz登陆相关
- Deep learning:三十二(基础知识_3)
- Deep learning:三十一(数据预处理练习)
- LeetCode 104 Maximum Depth of Binary Tree
- 如何在win7下远程控制ubuntu
- 7.多态
- Qt发布错误:无法定位程序输入点于动态链接库QtCore5.dll
- 类String的构造函数、析构函数和赋值函数
- Maven快速入门
- Android的Binder的起源-android学习之旅(100)
- Android的Binder的起源-android学习之旅(100)
- Android的Binder的起源-android学习之旅(100)
- Deep learning:三十(关于数据预处理的相关技巧)
- Deep learning:二十九(Sparse coding练习)
- C99新特性:变长数组(VLA)
- Linux内核及分析 第三周 Linux内核的启动过程