返回顶部
首页 > 资讯 > 移动开发 >Android编程实现在Bitmap上涂鸦效果
  • 848
分享到

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

bitmapAndroid 2022-06-06 09:06:57 848人浏览 独家记忆
摘要

本文实例讲述了Android编程实现在Bitmap上涂鸦效果。分享给大家供大家参考,具体如下: 布局文件: <?xml version="1.0" encod

本文实例讲述了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 
{ 
  
 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);
  } 
 } 
} 

整合的一个涂鸦工具类:



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;
 }
 
 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 开发实例简单涂鸦板Android 使用Path实现涂鸦功能Android实现Path平滑的涂鸦效果实例android实现简单的画画板实例代码Android采用双缓冲技术实现画板Android自定义SurfaceView实现画板功能Android实现画板、写字板功能(附源码下载)Android多媒体之画画板开发案例分享双缓冲技术实现Android 画板应用Android画画板的制作方法Android编程实现的手写板和涂鸦功能


--结束END--

本文标题: Android编程实现在Bitmap上涂鸦效果

本文链接: https://lsjlt.com/news/26258.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android编程实现在Bitmap上涂鸦效果
    本文实例讲述了Android编程实现在Bitmap上涂鸦效果。分享给大家供大家参考,具体如下: 布局文件: <?xml version="1.0" encod...
    99+
    2022-06-06
    bitmap Android
  • Android实现Path平滑的涂鸦效果实例
    前言在最近的一个项目中做了一个涂鸦的效果,手指快速移动,会出现折线,这篇文章记录笔触优化。下面话不多说了,来一起看看详细的介绍吧。优化前优化设计到的类:Paint,PathPath类记录了坐标点集合决定线条轨迹,Paint决定怎么画Pain...
    99+
    2023-05-30
    android path平滑 涂鸦
  • Vue怎么实现多点涂鸦效果
    这篇文章主要介绍“Vue怎么实现多点涂鸦效果”,在日常操作中,相信很多人在Vue怎么实现多点涂鸦效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue怎么实现多点涂鸦效果”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-05
  • AndroidStudio实现能在图片上涂鸦程序
    本文实例为大家分享了AndroidStudio实现能在图片上涂鸦的具体代码,供大家参考,具体内容如下 一、内容:设计一个能在图片上涂鸦的程序 二、实现 1. 布局文件activity...
    99+
    2024-04-02
  • Android实现Bitmap位图旋转效果
    位图的旋转也可以借助Matrix或者Canvas来实现。 通过postRotate方法设置旋转角度,然后用createBitmap方法创建一个经过旋转处理的Bitmap对象,最...
    99+
    2022-06-06
    bitmap Android
  • Android实现波浪线效果(xml bitmap)
    我们要实现的效果如下: 在这之前先带大家了解一下xml bitmap,何为XML Bitmap? XML Bitmap 是一个用XML定义的文件放在资源目录,定义的对象是图...
    99+
    2022-06-06
    XML bitmap 波浪线 Android
  • Python编程tkinter库Canvas实现涂鸦颜色表及围棋盘示例
    目录tkinter库Canvas操作三个实例实例一:涂鸦运行效果图:其它作图函数:实例二:颜色表运行效果图:实例三:围棋盘运行效果图:tkinter库Canvas操作三个实例 实例一...
    99+
    2024-04-02
  • Android编程实现3D旋转效果实例
    本文实例讲述了Android编程实现3D旋转效果的方法。分享给大家供大家参考,具体如下: 下面的示例是在Android中实现图片3D旋转的效果。 实现3D效果一般使用OpenG...
    99+
    2022-06-06
    3d旋转 3d Android
  • Android实现上拉吸顶效果
    本文实例为大家分享了Android实现上拉吸顶效果的具体代码,供大家参考,具体内容如下 效果图 1.home_layout.xml 此布局即可实现上拉标题固定在顶部 <xml...
    99+
    2024-04-02
  • Android实现京东上滑效果
    本文实例为大家分享了Android实现京东上滑效果的具体代码,供大家参考,具体内容如下 前言: 现在很多app首页的结构都有头部广告,上滑固定toolbar及侧滑广告位等展示,典型的...
    99+
    2024-04-02
  • 怎么在Android应用中利用Bitmap实现一个位图旋转效果
    怎么在Android应用中利用Bitmap实现一个位图旋转效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。位图的旋转也可以借助Matrix或者Canvas来实现。通过po...
    99+
    2023-05-31
    android bitmap roi
  • Android编程实现上方通知栏里闪动效果的方法
    本文实例讲述了Android编程实现上方通知栏里闪动效果的方法。分享给大家供大家参考,具体如下: 显示通知代码: private void showNotification(...
    99+
    2022-06-06
    方法 动效 Android
  • Android编程简单实现雷达扫描效果
    本文实例讲述了Android编程简单实现雷达扫描效果。分享给大家供大家参考,具体如下: 在eoe看到有一篇关于雷达扫描的文章,然后看了下,很简单,但是觉得还有很多可以优化的地方...
    99+
    2022-06-06
    雷达 Android
  • android小程序上滑下滑效果怎么实现
    今天小编给大家分享一下android小程序上滑下滑效果怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先看gif图:...
    99+
    2023-06-29
  • Android编程实现图标拖动效果的方法
    本文实例讲述了Android编程实现图标拖动效果的方法。分享给大家供大家参考,具体如下: 最近优化图标拖动时的速率,稍微有一点点效果,直接把代码贴出来,有兴趣一起讨论的朋友可以...
    99+
    2022-06-06
    方法 动效 Android
  • Android编程实现文字倒影效果的方法
    本文实例讲述了Android编程实现文字倒影效果的方法。分享给大家供大家参考,具体如下: 我们所有的view都继承自View类,View类里有个方法叫ondraw(). 即,我...
    99+
    2022-06-06
    方法 Android
  • Android编程实现擦除Bitmap中某一块的方法
    本文实例讲述了Android编程实现擦除Bitmap中某一块的方法。分享给大家供大家参考,具体如下: 以前要截取Bitmap中的图片使用的一块块的拼接,虽然可以实现,但是效率很...
    99+
    2022-06-06
    方法 bitmap Android
  • Android编程实现仿心跳动画效果的方法
    本文实例讲述了Android编程实现仿心跳动画效果的方法。分享给大家供大家参考,具体如下: // 按钮模拟心脏跳动 private void playHeartbeatAni...
    99+
    2022-06-06
    方法 动画 Android
  • Android编程实现3D滑动旋转效果的方法
    本文实例讲述了Android编程实现3D滑动旋转效果的方法。分享给大家供大家参考,具体如下: 这里我们通过代码实现一些滑动翻页的动画效果。 Animation实现动画有两个方式...
    99+
    2022-06-06
    方法 3d Android
  • Android编程实现摄像头临摹效果的方法
    本文实例讲述了Android编程实现摄像头临摹效果的方法。分享给大家供大家参考,具体如下:这篇文章结合本人的开发实例,介绍如何实现摄像头临摹效果,即将摄像头拍摄的画面作为临摹的物体投射到画纸上,用户可以在画纸上继续作画,效果如图1.主要可以...
    99+
    2023-05-30
    android 摄像头 roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作