android實(shí)現(xiàn)簡(jiǎn)單的畫(huà)畫(huà)板實(shí)例代碼
直接看代碼,注釋都寫(xiě)清楚了
public class MainActivity extends Activity {
private ImageView iv;
private Bitmap baseBitmap;
private Canvas canvas;
private Paint paint;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.iv = (ImageView) this.findViewById(R.id.iv);
// 創(chuàng)建一張空白圖片
baseBitmap = Bitmap.createBitmap(480, 640, Bitmap.Config.ARGB_8888);
// 創(chuàng)建一張畫(huà)布
canvas = new Canvas(baseBitmap);
// 畫(huà)布背景為灰色
canvas.drawColor(Color.GRAY);
// 創(chuàng)建畫(huà)筆
paint = new Paint();
// 畫(huà)筆顏色為紅色
paint.setColor(Color.RED);
// 寬度5個(gè)像素
paint.setStrokeWidth(5);
// 先將灰色背景畫(huà)上
canvas.drawBitmap(baseBitmap, new Matrix(), paint);
iv.setImageBitmap(baseBitmap);
iv.setOnTouchListener(new OnTouchListener() {
int startX;
int startY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 獲取手按下時(shí)的坐標(biāo)
startX = (int) event.getX();
startY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
// 獲取手移動(dòng)后的坐標(biāo)
int stopX = (int) event.getX();
int stopY = (int) event.getY();
// 在開(kāi)始和結(jié)束坐標(biāo)間畫(huà)一條線(xiàn)
canvas.drawLine(startX, startY, stopX, stopY, paint);
// 實(shí)時(shí)更新開(kāi)始坐標(biāo)
startX = (int) event.getX();
startY = (int) event.getY();
iv.setImageBitmap(baseBitmap);
break;
}
return true;
}
});
}
public void save(View view) {
try {
File file = new File(Environment.getExternalStorageDirectory(),
System.currentTimeMillis() + ".jpg");
OutputStream stream = new FileOutputStream(file);
baseBitmap.compress(CompressFormat.JPEG, 100, stream);
stream.close();
// 模擬一個(gè)廣播,通知系統(tǒng)sdcard被掛載
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
intent.setData(Uri.fromFile(Environment
.getExternalStorageDirectory()));
sendBroadcast(intent);
Toast.makeText(this, "保存圖片成功", 0).show();
} catch (Exception e) {
Toast.makeText(this, "保存圖片失敗", 0).show();
e.printStackTrace();
}
}
}
簡(jiǎn)單的布局文件
<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=".MainActivity" >
<Button
android:id="@+id/button1"
android:onClick="save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="保存圖片" />
<ImageView
android:layout_above="@id/button1"
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
再來(lái)個(gè)權(quán)限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
上兩張我畫(huà)的高端大氣上檔次的圖片。。。。
- Android實(shí)現(xiàn)畫(huà)板、寫(xiě)字板功能(附源碼下載)
- Android自定義SurfaceView實(shí)現(xiàn)畫(huà)板功能
- Android采用雙緩沖技術(shù)實(shí)現(xiàn)畫(huà)板
- Android畫(huà)板開(kāi)發(fā)之添加背景和保存畫(huà)板內(nèi)容為圖片
- Android畫(huà)板開(kāi)發(fā)之橡皮擦功能
- Android實(shí)現(xiàn)畫(huà)畫(huà)板案例
- Android編程實(shí)現(xiàn)畫(huà)板功能的方法總結(jié)【附源碼下載】
- Android畫(huà)板開(kāi)發(fā)之撤銷(xiāo)反撤銷(xiāo)功能
- Android多媒體之畫(huà)畫(huà)板開(kāi)發(fā)案例分享
- Android自定義View實(shí)現(xiàn)簡(jiǎn)易畫(huà)板功能
相關(guān)文章
Android編程使用HTTP協(xié)議與TCP協(xié)議實(shí)現(xiàn)上傳文件的方法
這篇文章主要介紹了Android編程使用HTTP協(xié)議與TCP協(xié)議實(shí)現(xiàn)上傳文件的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android使用HTTP協(xié)議與TCP協(xié)議的具體步驟與實(shí)現(xiàn)文件傳輸?shù)南嚓P(guān)技巧,需要的朋友可以參考下2016-01-01Android自定義View實(shí)現(xiàn)可拖拽縮放的矩形框
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)可拖拽縮放的矩形框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05Android使用自定義View實(shí)現(xiàn)橫行時(shí)間軸效果
這篇文章主要給大家介紹了關(guān)于Android使用自定義View實(shí)現(xiàn)橫行時(shí)間軸效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Android具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Android自定義控件實(shí)現(xiàn)雷達(dá)圖效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)雷達(dá)圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Android?Flutter控件封裝之視頻進(jìn)度條的實(shí)現(xiàn)
這篇文章主要來(lái)和大家分享一個(gè)很簡(jiǎn)單的控制器封裝案例,包含了基本的播放暫停,全屏和退出全屏,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-06-06Android中多個(gè)ContentProvider的初始化順序詳解
在日常Android開(kāi)發(fā)中經(jīng)常會(huì)寫(xiě)一些sdk來(lái)供他人或者自己調(diào)用,一般這些sdk都涉及到初始化,下面這篇文章主要給大家介紹了關(guān)于Android中多個(gè)ContentProvider的初始化順序的相關(guān)資料,需要的朋友可以參考下2022-04-04Android內(nèi)部存儲(chǔ)與外部存儲(chǔ)的示例講解
內(nèi)部存儲(chǔ)和外部存儲(chǔ)的概念隨著Android版本的更新也在發(fā)生不斷的變化。最早的內(nèi)部存儲(chǔ)指的是系統(tǒng)自帶的ROM存儲(chǔ),外部存儲(chǔ)指的是外置的Sdcard或者通過(guò)OTG掛在的USB存儲(chǔ)2023-03-03Android基于Mapbox?V10?繪制LineGradient軌跡
這篇文章主要介紹了Android基于Mapbox?V10?繪制LineGradient軌跡,文章通告介紹一些V10上的用法,最終講下如何繪制漸變運(yùn)動(dòng)記錄軌跡,感興趣的小伙伴可以參考一下2022-08-08Android應(yīng)用圖標(biāo)在狀態(tài)欄上顯示實(shí)現(xiàn)原理
Android應(yīng)用圖標(biāo)在狀態(tài)欄上顯示,以及顯示不同的圖標(biāo),其實(shí)很研究完后,才發(fā)現(xiàn),很簡(jiǎn)單,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06