Android編程實現(xiàn)手繪及保存為圖片的方法(附demo源碼下載)
本文實例講述了Android編程實現(xiàn)手繪及保存為圖片的方法。分享給大家供大家參考,具體如下:
運行效果圖預(yù)覽:

應(yīng) yzuo_08 要求做了此Demo,跟以前那個手寫板Demo不同的是可以將畫布的內(nèi)容保存為圖片。
附上關(guān)鍵代碼:
MainView.java
package com.tszy.views;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class MainView extends View {
private Paint paint;
private Canvas cacheCanvas;
private Bitmap cachebBitmap;
private Path path;
private int clr_bg, clr_fg;
public MainView(Context context, AttributeSet attrs) {
super(context, attrs);
clr_bg = Color.WHITE;
clr_fg = Color.CYAN;
paint = new Paint();
paint.setAntiAlias(true); // 抗鋸齒
paint.setStrokeWidth(3); // 線條寬度
paint.setStyle(Paint.Style.STROKE); // 畫輪廓
paint.setColor(clr_fg); // 顏色
path = new Path();
// 創(chuàng)建一張屏幕大小的位圖,作為緩沖
cachebBitmap = Bitmap.createBitmap(480, 800, Config.ARGB_8888);
cacheCanvas = new Canvas(cachebBitmap);
cacheCanvas.drawColor(clr_bg);
}
public MainView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(clr_bg);
// 繪制上一次的,否則不連貫
canvas.drawBitmap(cachebBitmap, 0, 0, null);
canvas.drawPath(path, paint);
}
/**
* 清空畫布
*/
public void clear() {
path.reset();
cacheCanvas.drawColor(clr_bg);
invalidate();
}
/**
* 將畫布的內(nèi)容保存到文件
* @param filename
* @throws FileNotFoundException
*/
public void saveToFile(String filename) throws FileNotFoundException {
File f = new File(filename);
if(f.exists())
throw new RuntimeException("文件:" + filename + " 已存在!");
FileOutputStream fos = new FileOutputStream(new File(filename));
//將 bitmap 壓縮成其他格式的圖片數(shù)據(jù)
cachebBitmap.compress(CompressFormat.PNG, 50, fos);
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private float cur_x, cur_y;
private boolean isMoving;
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN : {
cur_x = x;
cur_y = y;
path.moveTo(cur_x, cur_y);
isMoving = true;
break;
}
case MotionEvent.ACTION_MOVE : {
if (!isMoving)
break;
// 二次曲線方式繪制
path.quadTo(cur_x, cur_y, x, y);
// 下面這個方法貌似跟上面一樣
// path.lineTo(x, y);
cur_x = x;
cur_y = y;
break;
}
case MotionEvent.ACTION_UP : {
// 鼠標(biāo)彈起保存最后狀態(tài)
cacheCanvas.drawPath(path, paint);
path.reset();
isMoving = false;
break;
}
}
// 通知刷新界面
invalidate();
return true;
}
}
Activity 代碼:
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.iv_btn_clear :
view.clear();
break;
case R.id.iv_btn_save : {
try {
String sdState = Environment.getExternalStorageState(); // 判斷sd卡是否存在
// 檢查SD卡是否可用
if (!sdState.equals(android.os.Environment.MEDIA_MOUNTED)) {
Toast.makeText(this, "SD卡未準(zhǔn)備好!", Toast.LENGTH_SHORT).show();
break;
}
//獲取系統(tǒng)圖片存儲路徑
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
// Make sure the Pictures directory exists.
path.mkdirs();
//根據(jù)當(dāng)前時間生成圖片名稱
Calendar c = Calendar.getInstance();
String name = ""
+ c.get(Calendar.YEAR) + c.get(Calendar.MONTH) + c.get(Calendar.DAY_OF_MONTH)
+ c.get(Calendar.HOUR_OF_DAY) + c.get(Calendar.MINUTE) + c.get(Calendar.SECOND)
+ ".png";
//合成完整路徑,注意 / 分隔符
String string = path.getPath() + "/" + name;
view.saveToFile(string);
Toast.makeText(this, "保存成功!\n文件保存在:" + string, Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
Toast.makeText(this, "保存失敗!\n" + e, Toast.LENGTH_LONG).show();
}
break;
}
}
}
沒什么難度,主要是將Bitmap轉(zhuǎn)PNG圖片那里,找了一會發(fā)現(xiàn) Canvas 沒有直接或間接保存的方法,剛好這里我使用了雙緩沖,另一塊畫布的內(nèi)容位圖自己創(chuàng)建的,很自然想到將這個畫布的位圖保存為文件即可。
再查看 Bitmap 有個 compress(CompressFormat format, int quality,OutputStream stream) 方法,很明顯將文件輸出流傳給這個方法就OK
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.iv_btn_clear :
view.clear();
break;
case R.id.iv_btn_save : {
try {
String sdState = Environment.getExternalStorageState(); // 判斷sd卡是否存在
// 檢查SD卡是否可用
if (!sdState.equals(android.os.Environment.MEDIA_MOUNTED)) {
Toast.makeText(this, "SD卡未準(zhǔn)備好!", Toast.LENGTH_SHORT).show();
break;
}
//獲取系統(tǒng)圖片存儲路徑
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
// Make sure the Pictures directory exists.
path.mkdirs();
//根據(jù)當(dāng)前時間生成圖片名稱
Calendar c = Calendar.getInstance();
String name = ""
+ c.get(Calendar.YEAR) + c.get(Calendar.MONTH) + c.get(Calendar.DAY_OF_MONTH)
+ c.get(Calendar.HOUR_OF_DAY) + c.get(Calendar.MINUTE) + c.get(Calendar.SECOND)
+ ".png";
//合成完整路徑,注意 / 分隔符
String string = path.getPath() + "/" + name;
view.saveToFile(string);
Toast.makeText(this, "保存成功!\n文件保存在:" + string, Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
Toast.makeText(this, "保存失??!\n" + e, Toast.LENGTH_LONG).show();
}
break;
}
}
}
完整實例代碼點擊此處本站下載。
希望本文所述對大家Android程序設(shè)計有所幫助。
- Android中Glide實現(xiàn)超簡單的圖片下載功能
- Android使用okHttp(get方式)下載圖片
- Android中使用HttpURLConnection實現(xiàn)GET POST JSON數(shù)據(jù)與下載圖片
- Android 利用ViewPager實現(xiàn)圖片可以左右循環(huán)滑動效果附代碼下載
- Android使用緩存機制實現(xiàn)文件下載及異步請求圖片加三級緩存
- Android中使用七牛云存儲進行圖片上傳下載的實例代碼
- Android 下載網(wǎng)絡(luò)圖片并顯示到本地
- Android編程滑動效果之Gallery+GridView實現(xiàn)圖片預(yù)覽功能(附demo源碼下載)
- Android編程實現(xiàn)圖片的上傳和下載功能示例
- SimpleCommand實現(xiàn)圖片下載(二)
相關(guān)文章
解決Android啟動APP的一瞬間系統(tǒng)欄會變成藍色問題
這篇文章主要介紹了解決Android啟動APP的一瞬間系統(tǒng)欄會變成藍色問題,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06
Android自定義ViewGroup實現(xiàn)受邊界限制的滾動操作(3)
這篇文章主要為大家詳細(xì)介紹了Android自定義ViewGroup實現(xiàn)受邊界限制的滾動操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
Android 微信搖一搖功能實現(xiàn)詳細(xì)介紹
這篇文章主要介紹了Android 微信搖一搖功能實現(xiàn)詳細(xì)介紹的相關(guān)資料,并附實例代碼及實現(xiàn)微信搖一搖的思路,需要的朋友可以參考下2016-11-11
Android Studio新建工程默認(rèn)在build.gradle中加入maven阿里源的問題
這篇文章主要介紹了Android Studio新建工程默認(rèn)在build.gradle中加入maven阿里源的問題,本文通過實例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03

