自定义View实例——下雨天画面

来源:互联网 发布:win10软件分辨率不正常 编辑:程序博客网 时间:2024/04/28 05:11

AndroidManifest.xml

<?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=".MainActivity"            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.MainActivity

package com.cctvjiatao.rainview;import android.app.Activity;import android.os.Bundle;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.cctvjiatao.rainview.MainActivity" >    <com.cctvjiatao.rainview.v2.ManyRain        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="#000000"/></RelativeLayout>
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();@Overrideprotected final void onDraw(Canvas canvas) {if (thread == null) {thread = new DrawThread();thread.start();} else {drawSub(canvas);}}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();isRunning = false;}class DrawThread extends Thread {@Overridepublic 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.v2.ManyRain
package com.cctvjiatao.rainview.v2;import java.util.ArrayList;import android.content.Context;import android.graphics.Canvas;import android.util.AttributeSet;/** * @作者: jiatao * @修改时间:2016-3-13 下午12:33:39 * @包名:com.cctvjiatao.rainview.v2 * @文件名:ManyRain.java * @版权声明:www.cctvjiatao.com * @功能: 下雨的执行类 */public class ManyRain extends BaseView{private ArrayList<RainItem> list = new ArrayList<RainItem>();private int rainNum = 80;//雨滴的数量private int size = 20;//移动的距离private int rainColor = 0xffffffff;//画笔的初始颜色private boolean randColor = true; //是否变色public ManyRain(Context context, AttributeSet attrs) {super(context, attrs);}public ManyRain(Context context) {super(context);}@Overrideprotected void drawSub(Canvas canvas) {for(RainItem item: list){item.draw(canvas);}}@Overrideprotected void drawLogic() {for(RainItem item: list){item.move();}}@Overrideprotected void init() {for(int i = 0; i < rainNum; i ++){RainItem item = new RainItem(getWidth(), getHeight(), size, rainColor, randColor);list.add(item);}}}
0 0