如何在Android中的图像上绘画并将图像保存到手机图库

2024-04-22

** 我的目的是将绘制的图像与我的背景视图一起保存到画廊** //

public boolean onTouch(View view, MotionEvent event) {

        // draw the new Points to our internal canvas / bitmap

        System.out.println("onTouch(View vc) { IS CALLING11111111111");

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

            paint.setColor(Color.RED);

            path = new Path();

            path.moveTo(event.getX(), event.getY());

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

            int historySize = event.getHistorySize();

            for (int i = 0; i < historySize; i++) {

                path.lineTo(event.getHistoricalX(i),            
                                               event.getHistoricalY(i));

            }

            path.lineTo(event.getX(), event.getY());

            canvas.drawPath(path, paint);

        } 
                 else {
            return super.onTouchEvent(event);
        }

        invalidate();

        return true;
    }

请尝试下面的工作代码 我想这应该对你有帮助

   import android.content.Context;
   import android.graphics.Bitmap;
   import android.graphics.Canvas;
   import android.graphics.Matrix;
   import android.graphics.Paint;
   import android.view.MotionEvent;
   import android.view.View;

public class DrawableImageView extends View {
private Bitmap mBitmap;
private Bitmap pic;
private Canvas mCanvas;
private final Paint mPaint;
private int a = 255;
private int r = 255;
private int g = 255;
private int b = 255;
private float width = 4;

public DrawableImageView(Context c, Bitmap img) {
    super(c);
    pic = img;
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setARGB(a,r,g,b);


    Bitmap newBitmap = Bitmap.createBitmap(img.getWidth(), img.getHeight(),   Bitmap.Config.RGB_565);
  Canvas newCanvas = new Canvas();
  newCanvas.setBitmap(newBitmap);
 if (img != null) {
   newCanvas.drawBitmap(img, 0, 0, null);
  }
 mBitmap = newBitmap;
 mCanvas = newCanvas;

    mCanvas.setBitmap(mBitmap);
}

public DrawableImageView(Context c, Bitmap img, int alpha, int red, int green, int blue) {
 this(c, img);
 setColor(alpha, red, green, blue);
}    
public DrawableImageView(Context c, Bitmap img, int alpha, int red, int green, int blue, float w) {
 this(c, img, alpha, red, green, blue);
 width = w;
}

public Bitmap getBitmap() {return mBitmap;}
public void setWidth(float w) {width = w;}
public void setColor(int alpha, int red, int green, int blue) {
 a = alpha;
 r = red;
 g = green;
 b = blue;
    mPaint.setARGB(a,r,g,b);
}
  public void Undo() {
 mCanvas.drawBitmap(pic, 0, 0, null);
 invalidate();
}

float scaleX;
float scaleY;
float scale;
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {        
 scaleX = (float) w/mBitmap.getWidth();
 scaleY = (float) h/mBitmap.getHeight();
 scale = scaleX > scaleY ? scaleY : scaleX;
}

@Override protected void onDraw(Canvas canvas) {
    if (mBitmap != null) {
        Matrix matrix = new Matrix();
     matrix.postScale(scale, scale);
     canvas.drawBitmap(mBitmap, matrix, null);
        //canvas.drawBitmap(mBitmap, 0,0, null);
    }
}

float lastX;
float lastY;
@Override public boolean onTouchEvent(MotionEvent event) {
    mPaint.setStrokeWidth(width/scale);

    float curX =  event.getX()/scale;
    float curY =  event.getY()/scale;
   switch (event.getAction()){ 
   case MotionEvent.ACTION_DOWN:{
           mCanvas.drawCircle(curX, curY,width/2/scale, mPaint);
         break;
  }
   case MotionEvent.ACTION_MOVE:{
    mCanvas.drawLine(lastX, lastY, curX, curY, mPaint);
         mCanvas.drawCircle(curX, curY,width/2/scale, mPaint);  //fix for weird jaggies   occur between line start and line stop
         break;
  } 
   case MotionEvent.ACTION_CANCEL:
 case MotionEvent.ACTION_UP:{
   mCanvas.drawLine(lastX, lastY, curX, curY, mPaint);
         mCanvas.drawCircle(curX, curY,width/2/scale, mPaint);
         break;
 }

}
 lastX = curX;
 lastY = curY;
    invalidate();  //invalidate only modified rect...

 return true;
  }
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Android中的图像上绘画并将图像保存到手机图库 的相关文章

随机推荐

  • 如何在 Rails 3 中使用 Draper 修饰嵌套属性(关联)?

    我的环境 Rails 3 2 with draper https github com jcasimir draper gem 我正在使用嵌套资源 并且无法确定在哪里声明装饰器 app controllers users controlle
  • Chart.js如何获得组合条形图和折线图?

    我想问一下使用 Chart js 是否可以http www chartjs org http www chartjs org 获得组合条形图和折线图 感谢您的任何建议 下面的答案与 Chart js 1 x 有关 Chart js 2 x
  • Facebook 如何在不重新加载页面的情况下更改 url? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在不重新加载和 hack 的情况下更改 Windows 位置 https stackoverflow com questions 3997181 how could i change window
  • 如何从用户列表中查找PC

    我需要一些帮助 我不太确定这是否可能 我有清单samAccountName in csv文件 我需要从中获取他们的 PC 名称和 IP 我不太确定如何构建这样的脚本 一种方法是循环访问环境中的所有计算机并测试每台计算机 这当然会是SLOW
  • 泛型显式转换

    我实现了从字符串到名为 Foo 的对象的显式转换 所以 gt Foo f Foo foo 数据 作品 我需要实现一个将字符串转换为通用 T 的函数 在本例中 T 是 Foo 数据类型 public T Get
  • 宏的问题

    HI 有人可以帮助我理解为什么 SQUARE x 的值为 49 吗 我正在使用 Visual C 6 0 define SQUARE X X X int main int argc char argv int y 5 printf d n
  • 如何在 SwiftUI 中为按下时的导航链接设置动画?

    我试图通过在按下 NavigationLink 时提供一些反馈来改进用户体验 我的意思是一个简单的动画 它会增长然后缩小链接以显示它被按下或以任何其他方式提供反馈 这是我正在尝试改进的代码 NavigationLink destinatio
  • 在 C++ 中与 VARIANT 类型相互转换的简单方法

    有没有便于使用 高级类或库让您可以与VARIANT在 Visual C 中 更具体地说 我想在 POD 类型之间进行转换 例如double long 字符串 例如CString 和容器 例如std vector and VARIANTs 例
  • 如何使argparse在可执行程序中工作

    我有一个使用 argparse 模块的命令行脚本 import argparse def run print Running def export print Exporting def argument parser parser arg
  • 连接两个整数并将结果作为 SQL 中的字符串

    在表中 2 个字段 ID 为 int Number 为小 int 我想连接这两个字段并显示为字符串 eg ID 101 and Number 9 output 101 9 ID 和 Number 之间要加点吗 如何用SQL进行查询 You
  • 按日期订购 asp.net MVC 5

    我有一个创建新闻条目并显示 10 条新闻的应用程序 它应该显示 10 条 最新 新闻 现在它显示 10 个最旧的新闻 我该如何更改它 我是否更改控制器以便数据按日期排序 或者我可以在视图中执行吗 控制器 public ActionResul
  • postgres 检测零的重复模式

    有没有办法在 Postgres 的时间序列中检测长度至少为 3 的零子序列 year value 1 0 2 0 3 0 4 33 5 72 6 0 7 0 8 0 9 0 10 25 11 0 12 56 13 37 因此 在此示例中 我
  • 从链接服务器插入存储过程的结果

    是否可以将远程存储过程的结果插入到临时表中 例如 CREATE TABLE test id INT INSERT INTO test EXEC linkedserver remoteDB dbo tst DROP TABLE test 其中
  • Textview 在 Imageview 上滚动,就像 Pulse 应用程序滚动一样

    In my application I want to scroll the text on Image view like Pulse application Need not scroll inside the text view Pl
  • 分离Gdb而不恢复劣质

    Gdb 与任何其他程序一样 并不完美 我时不时会遇到导致当前 Gdb 实例无法使用的错误 此时 如果我有一个调试会话 其中有很多有价值的状态 我希望能够在其上启动一个新的 Gdb 会话 也就是说 分离 退出 Gdb 并启动一个新的 Gdb
  • 如何使用 XPath 选择多个可能的文本值?

    我必须从类似于下面的评级标签中选择评级代码 但仅限于机构为 SP 或 SNP 时 现在我有 ratings rating agency text SNP text SP code 但这似乎不起作用 我究竟做错了什么
  • 使用和不使用查询字符串路由旧请求

    开始之前 我知道this https stackoverflow com q 7395841 and this https stackoverflow com q 817325 我想找到一个更简洁的解决方案 如果可能的话 对于一个稍微更具体
  • 使用 OpenCL 或其他 GPGPU 框架在现代 x86 硬件上的 CPU 和 GPU 之间共享数据

    AMD Kaveri 的 hUMA 异构统一内存访问 和 Intel 第四代 CPU 证明了 CPU 和 GPU 硬件的不断统一 应该允许 CPU 和 GPU 之间进行无副本的数据共享 我想知道 最新的 OpenCL 或其他 GPGPU 框
  • Python 从数据库存储和检索密码的最安全方法

    希望将用户名和密码存储在数据库中 并且想知道最安全的方法是什么 我知道我必须在某处使用盐 但不确定如何安全地生成它或如何应用它来加密密码 一些示例 Python 代码将不胜感激 谢谢 将密码 盐存储为哈希值和盐 看看Django是如何做的
  • 如何在Android中的图像上绘画并将图像保存到手机图库

    我的目的是将绘制的图像与我的背景视图一起保存到画廊 public boolean onTouch View view MotionEvent event draw the new Points to our internal canvas