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 {
@Override
protected 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.v1.OneRain
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#000000"/>
</RelativeLayout>
com.cctvjiatao.rainview..v1.BaseView
package com.cctvjiatao.rainview;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
/**
* @作者: jiatao
* @修改时间:2016-3-13 上午9:42:00
* @包名:com.cctvjiatao.rainview
* @文件名:BaseView.java
* @版权声明:www.cctvjiatao.com
* @功能: 自定义View的封装类
*/
public abstract class BaseView extends View {
private boolean isRunning = true;
private long time = 30;
private DrawThread thread;
public BaseView(Context context) {
super(context);
}
public BaseView(Context context, AttributeSet attrs) {
super(context, attrs);
}
protected abstract void drawSub(Canvas canvas);
protected abstract void drawLogic();
@Override
protected 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() {
while (isRunning) {
drawLogic();
postInvalidate();
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
com.cctvjiatao.rainview.v1.OneRain
package com.cctvjiatao.rainview.v1;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import com.cctvjiatao.rainview.BaseView;
/**
* @作者: jiatao
* @修改时间:2016-3-13 上午9:59:32
* @包名:com.cctvjiatao.rainview.v1
* @文件名:OneRain.java
* @版权声明:www.cctvjiatao.com
* @功能:自定义View: 一滴雨的落下
*/
public class OneRain extends BaseView {
private Paint paint = new Paint();
private float startX, startY, stopX, stopY, sizeX, sizeY;
private float speed;//可控制速度
public OneRain(Context context) {
super(context);
}
public OneRain(Context context, AttributeSet attrs) {
super(context, attrs);
speed = 1f;
sizeX = 10 * speed;
sizeY = 30 * speed;
startX = 100;
startY = 0;
stopX = startX + sizeX;
stopY = startY + sizeY;
paint.setColor(0xffffffff);
}
@Override
protected void drawSub(Canvas canvas) {
canvas.drawLine(startX, startY, stopX, stopY, paint);
}
@Override
protected void drawLogic() {
startX += sizeX;
stopX += sizeX;
startY += sizeY;
stopY += sizeY;
if (startY > getHeight()) {
startX = 100;
startY = 0;
stopX = startX + sizeX;
stopY = startY + sizeY;
}
}
}