Android编程实现在Bitmap上涂鸦效果_Android

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

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical" >
 <LinearLayout
  android:id="@+id/handwriteview"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" />
 <LinearLayout
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="horizontal"
  android:gravity="center_horizontal" >
  <Button
   android:id="@+id/clear"
   android:layout_width="200dp"
   android:layout_height="wrap_content"
   android:text="清屏" />
 </LinearLayout>
</LinearLayout> 

重写的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程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, bitmap
涂鸦
安卓编程 bitmap、bitmap 实现、unity实现涂鸦、用flash实现涂鸦跳跃、android bitmap,以便于您获取更多的相关知识。

时间: 2024-07-29 17:51:57

Android编程实现在Bitmap上涂鸦效果_Android的相关文章

android开发-android如何实现在view上跳出一个对话框后,对话框后的界面的点击就失效了那?

问题描述 android如何实现在view上跳出一个对话框后,对话框后的界面的点击就失效了那? 类似支付宝的这个效果:开发-android如何实现在view上跳出一个对话框后,对话框后的界面的点击就失效了那?-html跳出对话框"> 无论如何点击弹出框后面的部分,弹出框都不会消失. 解决方案 对话框是模态的,会阻止其他操作,关掉后才行 解决方案二: dialog.setCanceledOnTouchOutside(true); 解决方案三: 现实对话框的方式有dialog,PopupWin

Android编程实现小说阅读器滑动效果的方法_Android

本文实例讲述了Android编程实现小说阅读器滑动效果的方法.分享给大家供大家参考,具体如下: 看过小说都知道小说阅读器翻页有好多种效果,比如仿真翻页,滑动翻页,等等.由于某种原因,突然想写一个简单点的滑动翻页效果.在这里写出来也没有什么意图,希望大家可以根据这个效果举一反三,写出其他的效果.图就不上了. 下面是代码:大家理解onTouch事件即可 package com.example.testscroll.view; import android.content.Context; impor

Android编程实现图片的上传和下载功能示例_Android

本文实例讲述了Android编程实现图片的上传和下载功能.分享给大家供大家参考,具体如下: 在实现一个Android的WEB服务客户端,比如微博,论坛客户端时,经常会使用到图片的上传和下载.在这里介绍如何利用HttpClient实现图片的上传和下载功能. 1 图片上传:上传图片时,首先获得图片的路径,创建文件,并将图片转化为字节流写入到request,并发送该请求. 客户端代码: File file = new File(imageUrl); String httpUrl = httpDomai

Android编程设定activity进入和退出效果的方法

本文实例讲述了Android编程设定activity进入和退出效果的方法.分享给大家供大家参考,具体如下: 看了android的源代码和资源文件,终于明白如何去修改设置Dialog和Activity的进入和退出效果了.设置Dialog首先通过getWindow()方法获取它的窗口,然后通过getAttributes()方法获得window的WindowManager.LayoutParams lp, lp有个公共属性windowAnimations, 只要把要实现的animation的id赋值给

Android编程简单获取网络上的图片

本文实例讲述了Android编程简单获取网络上的图片的方法.分享给大家供大家参考,具体如下: 要获取网络上的图片,首先得有网络的访问权限,这个不再写了,以前的文章中写过,还有布局方式不再写了,就是写也是一个简单的布局,没有多大意义,直接上核心代码: 这是本人使用的一个简单的类,来获取网上的图片. public static Bitmap getImage(String Url) throws Exception { try { URL url = new URL(Url); String res

Android编程实现图片的上传和下载功能示例

本文实例讲述了Android编程实现图片的上传和下载功能.分享给大家供大家参考,具体如下: 在实现一个Android的WEB服务客户端,比如微博,论坛客户端时,经常会使用到图片的上传和下载.在这里介绍如何利用HttpClient实现图片的上传和下载功能. 1 图片上传:上传图片时,首先获得图片的路径,创建文件,并将图片转化为字节流写入到request,并发送该请求. 客户端代码: File file = new File(imageUrl); String httpUrl = httpDomai

Android编程实现擦除Bitmap中某一块的方法

  Android编程实现擦除Bitmap中某一块的方法         以前要截取Bitmap中的图片使用的一块块的拼接,虽然可以实现,但是效率很低.想了很久,无意中看到网上的对BITMAP图片的RGB信息进行修改,然后想出了这个办法,感觉用起来还是挺舒服.很多出错处理都没有写,只实现基本功能啊 public static Bitmap setTransparentAreaForBitmap(Bitmap b, int width, int height, int paddingleft, i

Android编程实现可滑动的开关效果(附demo源码下载)_Android

本文实例讲述了Android编程实现可滑动的开关效果.分享给大家供大家参考,具体如下: 闲着没事,把之前写的一个Demo放上来分享下.就是一个开关,实现可滑动和动画效果.不是图片切换. 好了,先上图: 完整实例代码点击此处本站下载. 直接把自定义的这个View代码放上来,有注释应该很好理解: 首先是布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&qu

Android编程实现基于BitMap获得图片像素数据的方法_Android

本文实例讲述了Android编程实现基于BitMap获得图片像素数据的方法.分享给大家供大家参考,具体如下: 网上看到的参考是: int[] pixels = new int[bit.getWidth()*bit.getHeight()];//保存所有的像素的数组,图片宽×高 bit.getPixels(pixels,0,bit.getWidth(),0,0,bit.getWidth(),bit.getHeight()); for(int i = 0; i < pixels.length; i+