android bitmap 写字,Android编程实现在Bitmap上涂鸦效果

这篇博客详细介绍了如何在Android平台上实现Bitmap的涂鸦效果。通过自定义View类`HandWrite`,结合`onTouchEvent`监听用户触摸事件,实现在图片上绘制线条的功能。同时,还提供了清除画布的按钮以及调整线条宽度的方法。此外,文章还展示了一个整合的涂鸦工具类`TuYaView`,用于处理图像的缩放和保存用户的绘制操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文实例讲述了Android编程实现在Bitmap上涂鸦效果。分享给大家供大家参考,具体如下:

布局文件:

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

android:id="@+id/handwriteview"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="horizontal"

android:gravity="center_horizontal" >

android:id="@+id/clear"

android:layout_width="200dp"

android:layout_height="wrap_content"

android:text="清屏" />

重写的View文件:

public class HandWrite extends View

{

private Paint paint = null;

private Bitmap originalBitmap = null;

private Bitmap new1Bitmap = null;

private Bitmap new2Bitmap = null;

private float clickX = 0,clickY = 0;

private float startX = 0,startY = 0;

private boolean isMove = true;

private boolean isClear = false;

private int color = Color.GREEN;

private float strokeWidth = 2.0f;

public HandWrite(Context context,Bitmap b)

{

super(context);

originalBitmap = Bitmap.createBitmap(b).copy(Bitmap.Config.ARGB_8888, true);

new1Bitmap = Bitmap.createBitmap(originalBitmap);

}

public void clear(){

isClear = true;

new2Bitmap = Bitmap.createBitmap(originalBitmap);

invalidate();

}

public void setstyle(float strokeWidth){

this.strokeWidth = strokeWidth;

}

@Override

protected void onDraw(Canvas canvas)

{

super.onDraw(canvas);

canvas.drawBitmap(HandWriting(new1Bitmap), 0, 0,null);

}

public Bitmap HandWriting(Bitmap originalBitmap)

{

Canvas canvas = null;

if(isClear){

canvas = new Canvas(new2Bitmap);

}

else{

canvas = new Canvas(originalBitmap);

}

paint = new Paint();

paint.setStyle(Style.STROKE);

paint.setAntiAlias(true);

paint.setColor(color);

paint.setStrokeWidth(strokeWidth);

if(isMove){

canvas.drawLine(startX, startY, clickX, clickY, paint);

}

startX = clickX;

startY = clickY;

if(isClear){

return new2Bitmap;

}

return originalBitmap;

}

@Override

public boolean onTouchEvent(MotionEvent event)

{

clickX = event.getX();

clickY = event.getY();

if(event.getAction() == MotionEvent.ACTION_DOWN){

isMove = false;

invalidate();

return true;

}

else if(event.getAction() == MotionEvent.ACTION_MOVE){

isMove = true;

invalidate();

return true;

}

return super.onTouchEvent(event);

}

}

Activity文件:

public class HandWritingActivity extends Activity

{

/** Called when the activity is first created. */

private LinearLayout handWrite = null;

private Button clear = null;

int requestWidth=116;

int requestHeight=173;

int inSampleSize;

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_hand_writing);

handWrite = (LinearLayout)findViewById(R.id.handwriteview);

clear = (Button)findViewById(R.id.clear);

clear.setOnClickListener(new clearListener());

}

private class clearListener implements OnClickListener{

public void onClick(View v)

{

// handWrite.clear();

BitmapFactory.Options opts = new Options();

opts.inJustDecodeBounds = true;// 让 bimapfactory假的解析这个位图,只获取位图的边框信息

BitmapFactory.decodeResource(getResources(), R.drawable.cool, opts);

if (opts.outHeight > requestHeight || opts.outWidth > requestWidth) {

if (opts.outWidth > opts.outHeight) {

inSampleSize = Math.round((float) opts.outHeight

/ (float) requestHeight);

} else {

inSampleSize = Math.round((float) opts.outWidth

/ (float) requestWidth);

}

}

System.out.println("宽度:" + opts.outWidth);

System.out.println("高度:" + opts.outHeight);

opts.inSampleSize = inSampleSize;

System.out.println(inSampleSize);

opts.inJustDecodeBounds = false;// 由于已经得到了缩放比例 ,让位图工厂真正的解析这个位图

// 由于前面 我们已经解析了这个输入流, 需要重新初始化这个输入流

Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.cool, opts);

HandWrite hw = new HandWrite(HandWritingActivity.this, b);

System.out.println(b.getWidth());

handWrite.addView(hw);

}

}

}

整合的一个涂鸦工具类:

/**

* 使用方法:

* 1. 创建TuYaView类实例

* 2. 调用drawTuya方法

* 3. 参数1:context

* 4. 参数2:图像的byte[]字节数组

* 5. ImageView实例

* 6. 画笔定义

* **/

import com.ziipin.lhdc.utils.ToastUtil;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Matrix;

import android.graphics.Paint;

import android.graphics.BitmapFactory.Options;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.ImageView;

public class TuYaView {

// 原始图片

private Bitmap mOrignBitmap;

private Bitmap mEditBitmap;

private int inSampleSize;

private int requestWidth = 500;

private int requestHeight = 700;

/** 编辑图片的画布 */

private Canvas mCanvas;

private ImageView image;

private Paint mPaint;

public Bitmap drawTuya(Context context, byte[] _data, ImageView image,

Paint mPaint) {

this.image = image;

this.mPaint = mPaint;

mOrignBitmap = BitmapFactory.decodeByteArray(_data, 0, _data.length);

return showEditBitmap(context, _data, image);

}

/**

* 显示编辑的图片

*/

private Bitmap showEditBitmap(Context context, byte[] _data, ImageView image) {

mOrignBitmap = getScaleBitmap(_data, image);

if (mOrignBitmap == null) {

ToastUtil.show(context, "编辑出错");

}

mEditBitmap = mOrignBitmap.copy(mOrignBitmap.getConfig(), true);

mCanvas = new Canvas(mEditBitmap);

mCanvas.drawBitmap(mOrignBitmap, new Matrix(), new Paint());

image.setImageBitmap(mEditBitmap);

image.setOnTouchListener(mTouchListener);

return mEditBitmap;

}

/**

* 获取结果缩放放后的图片

*

* @return

*/

private Bitmap getScaleBitmap(byte[] _data, ImageView image) {

BitmapFactory.Options opts = new Options();

opts.inJustDecodeBounds = true;// 让 bimapfactory假的解析这个位图,只获取位图的边框信息

BitmapFactory.decodeByteArray(_data, 0, _data.length, opts);

if (opts.outHeight > requestHeight || opts.outWidth > requestWidth) {

if (opts.outWidth > opts.outHeight) {

inSampleSize = Math.round((float) opts.outHeight

/ (float) requestHeight);

} else {

inSampleSize = Math.round((float) opts.outWidth

/ (float) requestWidth);

}

}

opts.inSampleSize = inSampleSize;

opts.inJustDecodeBounds = false;// 由于已经得到了缩放比例 ,让位图工厂真正的解析这个位图

// 由于前面 我们已经解析了这个输入流, 需要重新初始化这个输入流

Bitmap bmp = BitmapFactory

.decodeByteArray(_data, 0, _data.length, opts);

return bmp;

}

// touch事件

private OnTouchListener mTouchListener = new OnTouchListener() {

int startx = 0;

int starty = 0;

@Override

public boolean onTouch(View v, MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:// 手指第一次触摸屏幕

startx = (int) event.getX();

starty = (int) event.getY();

break;

case MotionEvent.ACTION_MOVE: // 手指在imageview上中移动

int x = (int) event.getX();

int y = (int) event.getY();

mCanvas.drawLine(startx, starty, x, y, mPaint);

startx = (int) event.getX();

starty = (int) event.getY();

image.invalidate();

break;

}

return true;

}

};

}

希望本文所述对大家Android程序设计有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值