在剛收到這個任務是,我就想起了Bitmap Canvas Paint這些類。並且發現畫線的長短,顏色都是隨機的,這也說明了
int width = wm.getDefaultDisplay().getWidth();
繪圖所必須的3個類使用方法自己總結了一下:
傳不上資源庫,直接貼代碼:
【Draw是使用自定義控件畫線】
控件類MyView 繼承了View類
<span style="font-size:14px;">package com.example.view;
import java.util.Random;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View {
private Bitmap bitmap ; //保存繪製結果
private Canvas tempCanvas; //創建畫布
private Paint paint = new Paint();
private int width; //畫布的寬度
private int height; //畫布的高度
private int startX; //畫線的開始X座標
private int startY; //畫線的開始Y座標
private int stopX; //畫線結束的X座標
private int stopY; //畫線結束的Y座標
private int paintColor; //畫筆的顏色
private Random paintRL = new Random(); //創建隨機對象
private int[] paintColors = new int[] { Color.RED, Color.BLUE,
Color.YELLOW, Color.GREEN, Color.CYAN };
/*
* 自定義控件必須實現的3個方法
* */
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
//當線程調用時把bitmap清空
public void clear(){
bitmap = null;
}
@Override
protected void onDraw(Canvas canvas) {
//canvas.drawColor(Color.BLACK);
width = canvas.getWidth();
height = canvas.getHeight();
paintColor = paintColors[paintRL.nextInt(5)];
paint.setColor(paintColor);
paint.setStrokeWidth(5);
startX = width/2;
startY = height/2;
stopX = paintRL.nextInt(width);
stopY = paintRL.nextInt(height);
if(bitmap == null)//如果bitmap爲空,重新創建新的Bitmap.
{
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
canvas.drawBitmap(bitmap, 0, 0, paint);
}else
{ //把線先存放到bitmap中
tempCanvas = new Canvas(bitmap);
tempCanvas.drawLine(startX, startY, stopX, stopY, paint);
//把bitmap中所有的先重新繪製
canvas.drawBitmap(bitmap, 0, 0, paint);
}
}
}</span>
MainActivity
<span style="font-size:14px;">package com.dewav.draw;
import com.example.view.MyView;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
public MyView myView ;
boolean closeActivity ;
int count=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
onDrawLine();
}
public void onDrawLine()
{
myView = (MyView) findViewById(R.id.myView);
new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true)
{
if(count>100){
myView.clear();
count = 1;
}
myView.postInvalidate();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
count ++;
if(closeActivity)
{
return ;
}
}
}
}.start();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
closeActivity = true;
}
}</span>
main_layout:<span style="font-size:14px;"><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"
android:background="#000000"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.dewav.draw.MainActivity" >
<com.example.view.MyView
android:id="@+id/myView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
/>
</RelativeLayout></span>
【archerDrewline使用的是控件imageView畫線】
mainActivity:
package com.example.archerdrawline;
import java.util.Random;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.widget.ImageView;
public class MainActivity extends Activity {
boolean isQuit = false;
boolean clearBitmap = false;
int width;
int height;
int paintColor;
int[] paintColors = new int[]{Color.RED,Color.BLUE,Color.YELLOW,Color.GREEN,Color.CYAN};
ImageView mImageView;
Paint paint; //畫筆
Bitmap mBitmap; //保存所有繪畫
Canvas mCanvas; //用於畫線的畫布
Random paintRL = new Random();
private Handler messageHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.imageV);
WindowManager wm = this.getWindowManager();
width = wm.getDefaultDisplay().getWidth();
height = wm.getDefaultDisplay().getHeight();
//得到當前線程的Looper實例,由於當前線程是UI線程也可以通過Looper.getMainLooper()得到
Looper looper = Looper.myLooper();
//此處甚至可以不需要設置Looper,因爲 Handler默認就使用當前線程的Looper
messageHandler = new MessageHandler(looper);
init();
}
public void init()
{
new Thread(){
@Override
public void run() {
super.run();
int count =0;
while (true) {
count++;
if (count > 1000) {
// 清屏重新畫
//mBitmap.isRecycled();
clearBitmap = true;
count = 0;
}
messageHandler.sendEmptyMessage(0);
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//如果退出了 結束線程
if (isQuit) {
break;
}
}
}
}.start();
}
//創建畫圖
public void doDraw(){
if(clearBitmap)
{
mBitmap = null;
clearBitmap= false;
}
//開始點在屏幕中心(get center coordinates)
float startX = width/2;
float startY = height/2;
float stopX = paintRL.nextInt(width);
float stopY = paintRL.nextInt(height);
if(mBitmap ==null)
{
//創建一個位圖用來存放
mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
mImageView.setImageBitmap(mBitmap);
}else{
paint = new Paint();//由於沒有創建畫筆對象,總是報null object reference
paintColor = paintColors[paintRL.nextInt(5)];
paint.setColor(paintColor);
paint.setStrokeWidth(5);
//把線畫到bitmap上
mCanvas = new Canvas(mBitmap);
mCanvas.drawLine(startX, startY, stopX, stopY, paint);
}
//再把bitmap畫到canvas上
mImageView.setImageBitmap(mBitmap);
/*Message message = Message.obtain();
message.obj = mBitmap;
messageHandler.sendMessage(message);*/
}
class MessageHandler extends Handler{
public MessageHandler(Looper looper) {
super(looper);
// TODO Auto-generated constructor stub
}
@Override
public void handleMessage(Message msg) {
//mImageView.setImageBitmap((Bitmap)msg.obj);
doDraw();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
isQuit = true;
}
}
main_layout:
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.archerdrawline.MainActivity" >
<ImageView
android:id="@+id/imageV"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:background="@drawable/bg"
/>
</RelativeLayout>