Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Android Canvas Paint签名应用

我在android画图签名应用程序中工作,它具有清除画布和保存为位图图像的灵活性。我在这个应用程序中遇到了一个问题,每当我想要将画布保存为位图时,我需要检查签名是否足够长。如果签名太短,我必须要求用户重新签名。下面是我的代码:这里有两个类。

FingerPaintActivity

代码语言:javascript
运行
AI代码解释
复制
public class FingerPaintActivity extends Activity implements OnClickListener{

private Button clearBtn, saveBtn;

private View myView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    myView = findViewById(R.id.myView);

    clearBtn = (Button) findViewById(R.id.clearBtn);
    clearBtn.setOnClickListener(this);

    saveBtn = (Button) findViewById(R.id.submitBtn);
    saveBtn.setOnClickListener(this);

}

@Override
public void onClick(View v) {

    if (v == clearBtn) {

        MyView.clearCanvas();
        myView.invalidate();
        myView.refreshDrawableState();

    } else {

        myView.setDrawingCacheEnabled(true);

        myView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        myView.layout(0, 0, myView.getWidth(), myView.getHeight());
        myView.buildDrawingCache(true);
        Bitmap bm = Bitmap.createBitmap(myView.getDrawingCache());
        myView.setDrawingCacheEnabled(false);
        if (bm != null) {
            try {
                String path = Environment.getExternalStorageDirectory().toString();
                OutputStream fOut = null;
                File file = new File(path, "screentest.jpg");
                fOut = new FileOutputStream(file);
                bm.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
                fOut.flush();
                fOut.close();
                Log.e("ImagePath", "Image Path : " + MediaStore.Images.Media.insertImage( getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName()));

                sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
}

这是第二个类: MyView

代码语言:javascript
运行
AI代码解释
复制
public class MyView extends View {

// private static final float MINP = 0.25f;
// private static final float MAXP = 0.75f;

private Bitmap mBitmap;
private static Canvas mCanvas;
private Path mPath;
private Paint mBitmapPaint;
private Paint mPaint;

public MyView(Context c) {
    super(c);

}

public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);

    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setDither(true);
    mPaint.setColor(Color.BLACK);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(6);
    mBitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(mBitmap);
    mPath = new Path();
    mBitmapPaint = new Paint(Paint.DITHER_FLAG);
}

public MyView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
}

@Override
protected void onDraw(Canvas canvas) {

    canvas.drawColor(0xFFAAAAAA);

    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

    canvas.drawPath(mPath, mPaint);
}

private float mX, mY;
private static final float TOUCH_TOLERANCE = 4;

private void touch_start(float x, float y) {
    mPath.reset();
    mPath.moveTo(x, y);
    mX = x;
    mY = y;
}

private void touch_move(float x, float y) {
    float dx = Math.abs(x - mX);
    float dy = Math.abs(y - mY);
    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
        mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
        mX = x;
        mY = y;
    }
}

private void touch_up() {
    mPath.lineTo(mX, mY);
    // commit the path to our offscreen
    mCanvas.drawPath(mPath, mPaint);
    // kill this so we don't double draw
    mPath.reset();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        touch_start(x, y);
        invalidate();
        break;
    case MotionEvent.ACTION_MOVE:
        touch_move(x, y);
        invalidate();
        break;
    case MotionEvent.ACTION_UP:
        touch_up();
        invalidate();
        break;
    }
    return true;
}

public static void clearCanvas() {
    Paint paint = new Paint();
    paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
    mCanvas.drawPaint(paint);
    paint.setXfermode(new PorterDuffXfermode(Mode.SRC));

}

}

我面临的唯一问题是在保存签名时,我必须检查位图或画布或绘画的大小,然后才能保存它。我不知道该找哪一个,如果有人有想法,请帮帮我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-23 18:48:09

一种简单的方法是对触摸坐标之间的距离进行求和,只有在和大于某个阈值时才接受签名。

因此,保持在touch_move()中绘制的总距离的游程和。

代码语言:javascript
运行
AI代码解释
复制
mTotal += Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));

然后再后来

代码语言:javascript
运行
AI代码解释
复制
if(mTotal >= MINIMUM_SIGNATURE_LENGTH)
{
    acceptSignature();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10722486

复制
相关文章
R语言dataframe数据转换
df_melt<-reshape2::melt(df,id.vars="x",variable.name="year",value.name="value")
爱学习的小明明
2020/09/14
2.2K0
R语言的数据结构与转换
任何数据分析的第一步都是按照所需要的格式创建数据集。在 R 中,这个任务包括两个步骤:首先选择一种数据结构来存储数据,然后将数据输入或者导入这个数据结构中。下面介绍 R 中用于存储数据的多种数据结构。
timerring
2023/10/13
6540
R语言的数据结构与转换
分析R中的Elasticsearch数据
您可以在任何可以安装R和Java的计算机上使用纯R脚本和标准SQL访问Elasticsearch数据。您可以使用适用于Elasticsearch的CData JDBC驱动程序和RJDBC软件包来处理R中的远程Elasticsearch数据。通过使用CData驱动程序,您可以利用为经过行业验证的标准编写的驱动程序来访问流行的开源数据R语言。本文介绍如何使用驱动程序对Elasticsearch执行SQL查询,并通过调用标准R函数可视化Elasticsearch数据。
用户3382876
2018/11/05
2.8K0
Python中的数据类型转换
隐式类型转换 在隐式类型转换中,Python 会自动将一种数据类型转换为另一种数据类型,不需要我们去干预。 以下实例中,我们对两种不同类型的数据进行运算,较低数据类型(整数)就会转换为较高数据类型(浮点数)以避免数据丢失。 实例 num_int = 123 num_flo = 1.23 num_new = num_int + num_flo print("datatype of num_int:",type(num_int)) print("datatype of num_flo:",type(num_flo)) print("Value of num_new:",num_new) print("datatype of num_new:",type(num_new)) 以上实例输出结果为: num_int 数据类型为: <class 'int'>num_flo 数据类型为: <class 'float'>num_new: 值为: 124.23num_new 数据类型为: <class 'float'> 代码解析:
matinal
2023/10/13
3270
python数据清洗中的时间转换
我们可以用time.strftime函数转换字符串成struct_time,再用time.strftime()格式化想要的格式
overme
2022/01/17
9790
python数据清洗中的时间转换
Python中的数据类型转换
特别注意:python3比python2多了个字节的数据类型,python3字节专用函数:
py3study
2020/01/02
5.3K0
「R」R检验中的“数据是恆量”问题
这是一般做基因差异表达分析在使用t检验或者其他统计检验中常出现的一个问题。之前我学习和自己分析时就遇到过,尝试使用判断的方式事先检查它是不是数据存在问题(这类数据明显不服从正态分布),可以使用正态性检验,或者直接判断是不是样本组内的数据是完全一样的,如果一样就不要这个了。
王诗翔呀
2020/07/02
4.9K0
R中的数据导入与导出
1、数据的导入 导入文本文件 使用read.table函数导入普通文本文件 read.table(file,header=FALSE,sep="",...) #导入csv文件 data1 <- rea
Erin
2018/01/09
2.4K0
R中的数据导入与导出
JS中数据类型转换
JS中的数据类型分为 【基本数据类型】 数字 number 字符串 string 布尔 boolean 空 null 未定义 undefined 【引用数据类型】 对象 object - 普通对象 - 数组对象 (Array) - 正则对象 (RegExp) - 日期对象 (Date) - 数学函数 (Math) ... 函数 function
TimothyJia
2019/11/12
3.7K0
R数据科学整洁之道:使用tidyr进行长宽数据转换
数据这样组织有两个明显的好处:既方便以向量的形式访问每一个变量,也方便变量之间进行向量化运算。
简说基因
2022/11/11
3.8K0
R数据科学整洁之道:使用tidyr进行长宽数据转换
关联分析(4):购物篮数据转换R语言
我们现在有这样一份数据,记录了近173万用户的爱好情况(数据为随机生成)。数据中每行为一个用户,每列为一个爱好属性,“y”代表有此爱好,“n”代表无此爱好,我们希望通过关联分析找出用户会倾向于同时具有哪些爱好。数据保存为csv格式,并导入R中。
三猫
2018/11/30
1.2K0
关联分析(4):购物篮数据转换R语言
【R语言】基因ID转换
做生物学研究的人,难免会遇到各种各样的基因ID号。有我们比较熟悉的也比较直观的基因名字,如TP53。也有其他数据库里,但是也比较常用的ID,如ensembl ID,entrez gene ID等等。
生信交流平台
2022/09/21
2.8K0
【R语言】基因ID转换
R语言在数据科学中的应用
功能介绍 大数据时代,我们需要一个强大的软件Runing!!!R语言出现了!!!这里是R语言最好的学习交流平台,包括R语言书籍,R语言课程,R语言程序包使用,教你获取数据,处理数据,做出决策!! 一
小莹莹
2018/04/20
1.5K0
R语言在数据科学中的应用
Python中数据类型转换的函数和数据类型转换的重要性
学习Python的转换数据类型前期主要学习目标有两个,一是数据类型转换的必要性,二是数据类型转换常用方法。
python自学网
2022/03/07
1.1K0
Python中数据类型转换的函数和数据类型转换的重要性
基础知识 | R语言数据处理之日期值的转换
可能,刚开始学习R的人都会觉得日期值的处理非常简单,却常常在数据的深度分析,特别是利用时间序列绘制循环静态图、日历图、旭日图、螺旋图或者动态GIF/VIDEO等时出现Bug,罪魁祸首往往是因为日期值与字符型变量的相互转换、日期值的算术运算以及函数使用错误导致的。
黑妹的小屋
2020/08/06
7.8K0
MasterCAM怎样把后处理程序中的IJK转换成R表示
第一:打开mastercam,在菜单栏“机床类型”里选择随便一种机床类型,进入加工模块。
lrglu
2022/03/30
3.9K0
MasterCAM怎样把后处理程序中的IJK转换成R表示
左手用R右手Python系列——数据塑型与长宽转换
今天这篇是R语言 with Python系列的第三篇,主要跟大家分享数据处理过程中的数据塑型与长宽转换。 其实这个系列算是我对于之前学习的R语言系列的一个总结,再加上刚好最近入门Python,这样在总结R语言的同时,对比R语言与Pyhton在数据处理中常用解决方案的差异,每一个小节只讲一个小知识点,但是这些知识点都是日常数据处理与清洗过程中非常高频的需求。 不会跟大家啰嗦太多每一个函数的详细参数,只列出那些参数中的必要设定,总体以简单实用为原则。如若需要详细了解每一个函数的内部参数,还是需要自己查阅官方文档
数据小磨坊
2018/04/11
2.6K0
左手用R右手Python系列——数据塑型与长宽转换
R的数据
可以看出,字符型数据是在双引号或单引号中括起来的内容;数值型就是数字;逻辑型包括三个TRUE,FALSE和NA。
用户8284892
2023/03/08
3780
【原创】JavaScript中的数据类型以及数据类型的转换
JavaScript:5大基本数据类型: 数值型:number 布尔型:boolean 字符串型: string null类型:null undefined类型:undefined JavaScript中数值型的分类: 整数型、小数、Infinity(无穷大)、 -Infinity和NaN Infinity的出现情况: Java中除法运算中,分母不能为零,而在JavaScript中分母可以为零,相除的结果为Infinity。 NaN出现的情况: NaN指:Not a Number,当将非数值型
零点
2023/03/03
1.3K0
【R语言】R中的因子(factor)
R中的因子用于存储不同类别的数据,可以用来对数据进行分组,例如人的性别有男和女两个类别,根据年龄可以将人分为未成年人和成年人,考试成绩可以分为优,良,中,差。
生信交流平台
2022/09/21
3.4K0
【R语言】R中的因子(factor)

相似问题

如何修复python中的"AttributeError:模块‘pycocotools“没有属性”掩码“错误

12

如何修复错误:“AttributeError:模块'tensorflow‘没有属性'contrib’”

11

如何修复python2.7中的"AttributeError:‘模块’对象没有属性‘存储’“错误

261

如何修复AttributeError:在中运行python时,“模块”对象没有属性“Client”

35

Python错误:模块:‘AttributeError’对象没有属性

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档