gpt4 book ai didi

android - 从用户获取签名作为 Android (Eclipse) 中的输入

转载 作者:行者123 更新时间:2023-11-29 14:50:30 25 4
gpt4 key购买 nike

我正在开发一个 android 应用程序,在填写详细信息后的这一页中,在页面末尾我需要放置一些 imageview 或 fragement,用户可以在其中通过触摸来签署他们的签名。这样我就可以在单击提交时将该签名另存为图像。

我用谷歌搜索过这个,但我没有得到任何教程之类的东西来开始。如果你们知道,请帮助我解决这个问题或分享一些链接。

提前致谢,斯里坎特A这是我的类(class)文件,

package com.example.test_signature;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable.Callback;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;

public class SignatureView extends SurfaceView implements OnTouchListener, Callback, android.view.SurfaceHolder.Callback {

public SignatureView(Context context) {
super(context);
init();
}

public SignatureView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

private void init(){
this.setBackgroundColor(Color.WHITE);
mPaint = new Paint();
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(3);
this.setOnTouchListener(this);
this.getHolder().addCallback(this);
}

public void setStrokeWidth(float width){
mPaint.setStrokeWidth(width);
this.invalidate();
}

public void setColor(int color){
mPaint.setColor(color);
this.invalidate();
}

public void clear(){
mDots = new ArrayList<List<Dot>>();
//To prevent an exception
mDots.add(new ArrayList<Dot>());
this.invalidate();
}

private List<List<Dot>> mDots = new ArrayList<List<Dot>>();

private class Dot{

public float X = 0;
public float Y = 0;

public Dot(float x, float y){
X = x;
Y = y;
}
}

@Override
public boolean onTouch(View view, MotionEvent event) {
//mLastActivity = Calendar.getInstance();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
mDots.add(new ArrayList<Dot>());
mDots.get(mDots.size() - 1).add(new Dot(event.getX(), event.getY()));
this.invalidate();
break;
case MotionEvent.ACTION_UP:
mDots.get(mDots.size() - 1).add(new Dot(event.getX(), event.getY()));
this.invalidate();
break;
case MotionEvent.ACTION_MOVE:
mDots.get(mDots.size() - 1).add(new Dot(event.getX(), event.getY()));
this.invalidate();
break;
}
return true;
}

public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {

}

public void surfaceCreated(SurfaceHolder arg0) {

}

public void surfaceDestroyed(SurfaceHolder arg0) {

}

public Paint mPaint;
@Override
protected void onDraw(Canvas canvas) {
for(List<Dot> dots : mDots){
for(int i = 0; i < dots.size(); i++){
if(i - 1 == -1)
continue;
canvas.drawLine(dots.get(i - 1).X, dots.get(i - 1).Y, dots.get(i).X, dots.get(i).Y, mPaint);
}
}
}

public Bitmap getBitmap(){
Bitmap b = Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
this.draw(c);
return b;
}

public boolean exportFile(String pathString, String fileString){
File path = new File(pathString);
path.mkdirs();
if(!fileString.toLowerCase(Locale.ENGLISH).contains(".png")){
fileString += ".png";
}
File file = new File(path, fileString);
FileOutputStream out;
try {
out = new FileOutputStream(file);
this.getBitmap().compress(Bitmap.CompressFormat.PNG, 90, out);
return true;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
}

这是我的 XML 文件,我在其中创建了供用户放置签名的 View 。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".SignatureView" >

<View
android:id="@+id/id"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<com.example.test_signature.SignatureView
android:id="@+id/signature"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:height="18dp"
android:width="18dp" />

</RelativeLayout>

我创建了这个示例来测试签名功能。但是每当我运行这段代码时,我的应用程序就会崩溃。任何人都请帮帮我。我想我在我的 XML 中犯了一个错误。

@FabianCook:请查看我粘贴的代码。我只遵循你的程序。但是你能告诉我代码中的问题是什么吗?

我已经按照您的建议编辑了我的 XML 文件,但我的应用程序在打开时仍然会崩溃。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".SignatureView" >

<View
android:id="@+id/id"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<com.example.test_signature.SignatureView
android:id="@+id/signature"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>




</RelativeLayout>

最佳答案

public class SignatureView extends SurfaceView implements OnTouchListener, Callback {

public SignatureView(Context context) {
super(context);
init();
}

public SignatureView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

private void init(){
this.setBackgroundColor(Color.WHITE);
mPaint = new Paint();
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(3);
this.setOnTouchListener(this);
this.getHolder().addCallback(this);
}

public void setStrokeWidth(float width){
mPaint.setStrokeWidth(width);
this.invalidate();
}

public void setColor(int color){
mPaint.setColor(color);
this.invalidate();
}

public void clear(){
mDots = new ArrayList<List<Dot>>();
//To prevent an exception
mDots.add(new ArrayList<Dot>());
this.invalidate();
}

private List<List<Dot>> mDots = new ArrayList<List<Dot>>();

private class Dot{

public float X = 0;
public float Y = 0;

public Dot(float x, float y){
X = x;
Y = y;
}
}

@Override
public boolean onTouch(View view, MotionEvent event) {
//mLastActivity = Calendar.getInstance();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
mDots.add(new ArrayList<Dot>());
mDots.get(mDots.size() - 1).add(new Dot(event.getX(), event.getY()));
this.invalidate();
break;
case MotionEvent.ACTION_UP:
mDots.get(mDots.size() - 1).add(new Dot(event.getX(), event.getY()));
this.invalidate();
break;
case MotionEvent.ACTION_MOVE:
mDots.get(mDots.size() - 1).add(new Dot(event.getX(), event.getY()));
this.invalidate();
break;
}
return true;
}

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {

}

@Override
public void surfaceCreated(SurfaceHolder arg0) {

}

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {

}

public Paint mPaint;
@Override
protected void onDraw(Canvas canvas) {
for(List<Dot> dots : mDots){
for(int i = 0; i < dots.size(); i++){
if(i - 1 == -1)
continue;
canvas.drawLine(dots.get(i - 1).X, dots.get(i - 1).Y, dots.get(i).X, dots.get(i).Y, mPaint);
}
}
}

public Bitmap getBitmap(){
Bitmap b = Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
this.draw(c);
return b;
}

public boolean exportFile(String pathString, String fileString){
File path = new File(pathString);
path.mkdirs();
if(!fileString.toLowerCase(Locale.ENGLISH).contains(".png")){
fileString += ".png";
}
File file = new File(path, fileString);
FileOutputStream out;
try {
out = new FileOutputStream(file);
this.getBitmap().compress(Bitmap.CompressFormat.PNG, 90, out);
return true;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
}

我认为代码解释了它自己

这段代码会处理所有事情。有一些不错的小功能用于不同的事情,比如将图像保存到文件等。

将它放在您的一个包中,然后在您的 XML 文件中替换

<View android:id="@+id/id"/>

<package.name.SignatureView android:id="@+id/id"/>

用法

在你的包中创建一个名为SignatureView的新类,删除这个文件中除了第一行之外的所有内容,你应该留下package your.package.name

在第三行粘贴上面的代码并按 Ctrl-Shift-O 它将导入您需要的所有内容。

保存此文件,然后构建您的项目。

在您的 XML 文件中使用:

<your.package.name.SignatureView 
android:id="@+id/signature"
android:width="match_parent"
android:height="match_parent"/>

保存并构建您的项目。

在您的 Activity 中,您可以使用:

SignatureView mSignature;

mSignature = (SignatureView) this.findViewById(R.id.signature);

然后访问将签名保存到文件所需的函数:

mSignature.exportFile("/mnt/sdcard/", "signaturefile.png");

关于android - 从用户获取签名作为 Android (Eclipse) 中的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19654179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com