在开发的动作当中,有时候会遇到一些问题,尤其是电商或者银行类型的项目,会经常性的要求用户进行一个签名并进行上传,有的时候会要求签名并保存到本地。这个就涉及到了一个自定义view的过程了,其中我们要注意的是用户手势的问题,在按下、移动和放开的时候做不同的动作
public boolean onTouchEvent(MotionEvent event) {
if (touch != null) touch.OnTouch(true);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touchDown(event);
break;
case MotionEvent.ACTION_MOVE:
isTouched = true;
if (touch != null) touch.OnTouch(false);
touchMove(event);
break;
case MotionEvent.ACTION_UP:
//将路径画到bitmap中,即一次笔画完成才去更新bitmap,而手势轨迹是实时显示在画板上的。
cacheCanvas.drawPath(mPath, mGesturePaint);
mPath.reset();
break;
}
// 更新绘制
invalidate();
return true;
}
touchDown --- 手指点下屏幕时调用
private void touchDown(MotionEvent event) {
// 重置绘制路线
mPath.reset();
float x = event.getX();
float y = event.getY();
mX = x;
mY = y;
// mPath绘制的绘制起点
mPath.moveTo(x, y);
}
touchMove --- 手指在屏幕上滑动时调用
private void touchMove(MotionEvent event) {
final float x = event.getX();
final float y = event.getY();
final float previousX = mX;
final float previousY = mY;
final float dx = Math.abs(x - previousX);
final float dy = Math.abs(y - previousY);
// 两点之间的距离大于等于3时,生成贝塞尔绘制曲线
if (dx >= 3 || dy >= 3) {
// 设置贝塞尔曲线的操作点为起点和终点的一半
float cX = (x + previousX) / 2;
float cY = (y + previousY) / 2;
// 二次贝塞尔,实现平滑曲线;previousX, previousY为操作点,cX, cY为终点
mPath.quadTo(previousX, previousY, cX, cY);
// 第二次执行时,第一次结束调用的坐标值将作为第二次调用的初始坐标值
mX = x;
mY = y;
}
}
清除画板
public void clear() {
if (cacheCanvas != null) {
isTouched = false;
//更新画板信息
mGesturePaint.setColor(mPenColor);
cacheCanvas.drawColor(mBackColor, PorterDuff.Mode.CLEAR);
mGesturePaint.setColor(mPenColor);
invalidate();
}
}
自定义完成后其实在布局当中就是比较简单的了,直接引用就可以了
<com.carson.undergo.utils.view.LinePathView
android:id="@+id/line_name"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@color/colorWhite" />

当一切就绪后就只是在我们需要使用的地方进行调用就可以了,当然最好是对画板进行一个初始化并将画板清空,这里就相当于是点击下面的清空按钮,对画板进行了清空的操作
binding.lineName.setBackColor(Color.WHITE)
binding.lineName.setPaintWidth(20)
binding.lineName.setPenColor(Color.BLACK)
binding.lineName.clear()
在后面的操作当中,我们可能需要将画板总的图片进行上传到服务器或者保存下来,在这之前就需要就需要获取到画板当中的bitMap了,这里直接贴上方法
/**
* 获取view生成bitmap
*/
private fun createBitMapForView(view: View): Bitmap? {
view.measure(
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
)
val width = view.width
val height = view.height
view.layout(0, 0, width, height)
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565)
val canvas = Canvas(bitmap)
view.draw(canvas)
canvas.save()
return bitmap
}
最后一定不要忘记了添加存储权限,毕竟我们的图片最终是保存到本地的嘛~
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
虽然在manifest里面添加了读写权限,但是在Android的高版本上可能还是会保存失败,这个时候我们就需要进行动态的权限申请了,动态申请的方法有很多,可以自行发挥,嘿嘿
申请权限
最后在获取到权限之后再进行保存就完成了~
XXPermissions.with(mContext)
.permission(Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE)
.request(object : OnPermissionCallback {
override fun onGranted(permissions: MutableList<String>?, all: Boolean) {
if (all) {
ImageUtils.saveImageToGallery(mContext, bitmap)
binding.lineName.destroyDrawingCache()
} else {
ToastUtils.showMessage(mContext, "没有读写权限无法保存图片哦~")
}
}
override fun onDenied(permissions: MutableList<String>?, never: Boolean) {
if (never) {
ToastUtils.showMessage(mContext, "被永久拒绝授权,请手动授予读写权限");
XXPermissions.startPermissionActivity(
this@ElectronSignUI,
permissions
)
} else {
ToastUtils.showMessage(mContext, "获取读写权限失败")
}
}
})

最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
Ruby中是否有一种方法可以使用S/MIME对电子邮件消息进行数字签名?我们的团队使用PKI,我们的用户习惯于期待重要消息的数字签名。我知道我可以调用openssl命令行工具:opensslsmime-sign-signer$CERT_FILE-passinpass:$CERT_PASS-in$UNSIGNED_MAIL-out$SIGNED_MAIL-certfile$CERT_CA_FILE-from'your'-to'recipients'-subject'TheSubject'但我希望利用Ruby解决方案。 最佳答案 我最终
我通过Paperclipgem在Rails应用程序上上传了一些图像,我希望只有后端的管理员能够查看这些图像。因此,我将它们设置为私有(private)。然后我四处搜索解决方案,以了解只有具有特定链接的管理员才能查看文件。这就是我found.我继续尝试这个,但我正在努力创建所需的签名。公式在上面的链接中给出,是:Signature=URL-Encode(Base64(HMAC-SHA1(YourSecretAccessKeyID,UTF-8-Encoding-Of(StringToSign))));StringToSign=HTTP-VERB+"\n"+Content-MD5+"\n"+
我正在使用Foggem生成预签名url。我可以成功执行此操作以获得对该文件的读取权限。这是我的做法:fog_s3=Fog::Storage.new({:provider=>'AWS',:aws_access_key_id=>key,:aws_secret_access_key=>secret})object_path='foo.wav'expiry=Date.new(2014,2,1).to_time.to_iurl=fog_s3.directories.new(:key=>bucket).files.new(:key=>object_path).url(expiry,path_sty
历史:我在Amazon上创建了一个key和pem文件。我创建了一个私有(private)存储桶我创建了一个公共(public)分配并使用原始ID连接到私有(private)存储桶:有效我创建了一个私有(private)分配并像#3一样连接它-现在我得到拒绝访问:预期我很难生成一个有效的url。我一直在尝试按照此处描述的说明进行操作:http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?PrivateContent.html这就是我到目前为止所得到的......虽然不起作用-
我只是想了解SSL。我已经在我的本地主机上设置了一个Jetty服务器,并使用Keytool生成了我自己的证书.现在当我去https://localhost:8443/我收到无法信任此证书错误。我用keytool-export-aliaspongus-keystorekeystore-filecertfile.cer创建我认为是客户端需要向服务器进行身份验证的证书。(这是我可能大错特错的地方!)我有以下ruby代码:require'net/https'require'openssl'require'open-uri'puts'yay'ifFile.exists?('certfile.ce
我正在尝试在我的Rails服务器上生成一个预签名的url以发送到浏览器,以便浏览器可以上传到S3。aws-sdk-s3似乎是future可以使用的gem。但不幸的是,我还没有找到可以提供清晰度的gem文档。似乎有几种不同的方法可以做到这一点,如果对以下方法的区别有任何指导,我们将不胜感激-使用Aws::S3::Presigner.new(https://github.com/aws/aws-sdk-ruby/blob/master/aws-sdk-core/lib/aws-sdk-core/s3/presigner.rb),但它似乎没有接受对象参数或身份验证凭证。使用Aws::S3::
示例代码:#typed:trueclassKeyGettersig{params(env_var_name:String).returns(KeyGetter)}defself.from_env_var(env_var_name)returnNull.newifenv_var_name.nil?returnnew(env_var_name)enddefinitialize(env_var_name)@env_var_name=env_var_nameenddefto_key"keyfrom#{@env_var_name}"enddefto_s"strfrom#{@env_var_nam
运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid
1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La