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

本文实例讲述了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程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值