這個畫板可以實現簡單的繪圖功能,可以設置畫筆的顏色,可以設置畫刷,演示效果如下圖所示
點擊保存按鈕後可以將畫好的圖片保存在本地,並且在本相冊中可以看到保存在本地的圖片
實現方式:
第一步:使用Android Studio創建一個android工程,並且在drawable文件夾中放一張圖片作爲畫畫板的背景
第二步:修改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"
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=".MainActivity" >
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bg" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentBottom="true">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="紅色"
android:onClick="red" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="綠色"
android:onClick="green" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="刷子"
android:onClick="brush" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存"
android:onClick="save" />
</LinearLayout>
</RelativeLayout>
package com.fyt.drawingboard;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView iv;
//用於記錄觸摸點的座標
int startX;
int startY;
//用於創建畫板
private Canvas canvas;
//用於創建畫筆
private Paint paint;
//用於創建圖片副本
private Bitmap bmCopy;
private File file;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加載佈局文件
setContentView(R.layout.activity_main);
//加載畫板的背景圖
Bitmap bmSrc = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
//創建圖片副本,實際上是創建一張白紙
bmCopy = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());
//創建畫筆
paint = new Paint();
//創建一個畫板,並且將白紙鋪在畫板上
canvas = new Canvas(bmCopy);
//繪製
canvas.drawBitmap(bmSrc, new Matrix(), paint);
//獲得佈局文件上的ImageView控件
iv = (ImageView) findViewById(R.id.iv);
//將圖片副本放到ImageView控件中
//實際上將白紙放到ImageView控件中
iv.setImageBitmap(bmCopy);
//設置觸摸偵聽
iv.setOnTouchListener(new OnTouchListener() {
//觸摸屏幕時,觸摸事件產生時,此方法調用
@Override
public boolean onTouch(View v, MotionEvent event) {
//獲得手指觸摸屏幕時的動作
int action = event.getAction();
switch (action) {
//用戶的手指剛觸摸到屏幕
case MotionEvent.ACTION_DOWN:
//獲得觸摸點的座標
startX = (int) event.getX();
startY = (int) event.getY();
break;
//用戶的手指在屏幕上滑動
case MotionEvent.ACTION_MOVE:
//獲得觸摸點的位置
int x = (int) event.getX();
int y = (int) event.getY();
//繪製直線
canvas.drawLine(startX, startY, x, y, paint);
//每次繪製完畢之後,本次繪製的結束座標變成下一次繪製的初始座標
startX = x;
startY = y;
iv.setImageBitmap(bmCopy);
break;
//用戶手指離開屏幕
case MotionEvent.ACTION_UP:
break;
}
//true:告訴系統,這個觸摸事件由我來處理
//false:告訴系統,這個觸摸事件我不處理,這時系統會把觸摸事件傳遞給imageview的父節點
return true;
}
});
}
//紅色按鈕響應函數
public void red(View v) {
//設置畫筆的顏色爲紅色
paint.setColor(Color.RED);
}
//綠色按鈕響應函數
public void green(View v) {
//設置畫筆的顏色爲綠色
paint.setColor(Color.GREEN);
}
//畫刷按鈕響應函數
public void brush(View v) {
//將畫筆變成畫刷
paint.setStrokeWidth(7);
}
//保存按鈕響應函數
public void save(View v) {
//創建File對象,並且將文件的保存路徑設置爲sdcard/dazuo.png
file = new File("sdcard/dazuo.png");
//定義變量用於創建文件輸出流對象
FileOutputStream fos = null;
try {
//創建文件輸出流對象
fos = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//壓縮圖片
bmCopy.compress(CompressFormat.PNG, 100, fos);
//如果Android的版本是4.4或者以上的版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{
//掃描SD卡下的圖片
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
//Android版本在4.4以下
else
{
//發送sd卡就緒廣播,用來掃描SD卡下的圖片
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
sendBroadcast(intent);
}
}
}
<!--對SD卡的寫權限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--對SD卡的讀取權限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>