AndroidStudio实现能在图片上涂鸦程序
作者:Allison-L 发布时间:2023-09-14 06:57:02
标签:AndroidStudio,涂鸦
本文实例为大家分享了AndroidStudio实现能在图片上涂鸦的具体代码,供大家参考,具体内容如下
一、内容:设计一个能在图片上涂鸦的程序
二、实现
1. 布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
? ? xmlns:app="http://schemas.android.com/apk/res-auto"
? ? xmlns:tools="http://schemas.android.com/tools"
? ? android:layout_width="match_parent"
? ? android:layout_height="match_parent"
? ? tools:context=".MainActivity"
? ? android:orientation="vertical">
?
? ? <com.example.asus.test442.HandWrite
? ? ? ? android:layout_width="match_parent"
? ? ? ? android:layout_height="550dp"
? ? ? ? android:id="@+id/hw"/>
?
? ? <LinearLayout
? ? ? ? android:layout_width="match_parent"
? ? ? ? android:layout_height="wrap_content"
? ? ? ? android:orientation="vertical">
? ? ? ? <Button
? ? ? ? ? ? android:layout_width="match_parent"
? ? ? ? ? ? android:layout_height="wrap_content"
? ? ? ? ? ? android:text="clear"
? ? ? ? ? ? android:id="@+id/btn"/>
?
? ? </LinearLayout>
?
</LinearLayout>
2. 主控文件MainActivity.java
package com.example.asus.test442;
?
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
?
public class MainActivity extends AppCompatActivity {
? ? private HandWrite handWrite = null;
? ? Button clear = null;
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? handWrite = (HandWrite)findViewById(R.id.hw); //关联view组件
? ? ? ? clear = (Button)findViewById(R.id.btn);
? ? ? ? clear.setOnClickListener(new click());
? ? }
?
? ? private class click implements View.OnClickListener {
? ? ? ? @Override
? ? ? ? public void onClick(View view) {
? ? ? ? ? ? handWrite.clear();
? ? ? ? }
? ? }
}
3. 记录在屏幕上滑动的轨迹,实现在图片上涂鸦的功能 HandWrite.java
package com.example.asus.test442;
?
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
?
public class HandWrite extends View {
? ? Paint paint = null; ?//定义画笔
? ? Bitmap origBit = null; ?//存放原始图像
? ? Bitmap new_1Bit = null; ? //存放从原始图像复制的位图图像
? ? Bitmap new_2Bit = null; ? ? ?//存放处理后的图像
? ? float startX = 0,startY = 0; ? //画线的起点坐标
? ? float clickX = 0, clickY = 0; ? //画线的终点坐标
? ? boolean isMove = true; ? //设置是否画线的标记
? ? boolean isClear = false; ? ?//设置是否清除涂鸦的标记
? ? int color = Color.BLUE; ? ?//设置画笔的颜色
? ? float strokeWidth = 2.0f; ? ?//设置画笔的宽度
? ? public HandWrite(Context context, AttributeSet attrs) {
? ? ? ? super(context, attrs);
? ? ? ? // 从资源中获取原始图像
? ? ? ? origBit = BitmapFactory.decodeResource(getResources(),R.drawable.p1).copy(Bitmap.Config.ARGB_8888,true);
? ? ? ? // 建立原始图像的位图
? ? ? ? new_1Bit = Bitmap.createBitmap(origBit);
? ? }
?
? ? // 清除涂鸦
? ? public void clear() {
? ? ? ? isClear = true;
? ? ? ? new_2Bit = Bitmap.createBitmap(origBit);
? ? ? ? invalidate();
? ? }
?
? ? public void setSyle(float strokeWidth) {
? ? ? ? this.strokeWidth = strokeWidth;
? ? }
?
? ? @Override
? ? protected void onDraw(Canvas canvas) {
? ? ? ? super.onDraw(canvas);
? ? ? ? canvas.drawBitmap(HandWriting(new_1Bit),0,0,null);
? ? }
?
? ? private Bitmap HandWriting(Bitmap newBit) { ?//记录绘制图形
? ? ? ? Canvas canvas = null; ?// 定义画布
? ? ? ? if (isClear) { ?// 创建绘制新图形的画布
? ? ? ? ? ? canvas = new Canvas(new_2Bit);
? ? ? ? }
? ? ? ? else {
? ? ? ? ? ? canvas = new Canvas(newBit); ?//创建绘制原图形的画布
? ? ? ? }
?
? ? ? ? paint = new Paint();
? ? ? ? paint.setStyle(Paint.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 new_2Bit; ?// 返回新绘制的图像
? ? ? ? }
? ? ? ? return newBit; ?// 若清屏,则返回原图像
? ? }
?
? ? // 定义触摸屏事件
? ? @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);
? ? }
}
三、效果
来源:https://blog.csdn.net/weixin_40141473/article/details/89076551
0
投稿
猜你喜欢
- TimeSpan结构:表示一个时间间隔。它含有以下四个构造函数:TimeSpan(Int64)将 TimeSpan结构的新实例初始
- 转发和重定向相同点都是web开发中资源跳转的方式。不同点转发:是服务器内部的跳转,浏览器的地址栏不会发生变化。从一个页面到另一个页面的跳转还
- 前言异步调用几乎是处理高并发,解决性能问题常用的手段,如何开启异步调用?SpringBoot中提供了非常简单的方式,就是一个注解@Async
- private void btnCreate_Click(object sender, EventArgs e) ...{ int hWnd
- 效果图如下: Recyclerview 实现多选,单选,全选,反选,批量删除的步骤1.在Recyclerview布局中
- Java io简介Java io系统的设计初衷,就是为了实现“文件、控制台、网络设备”这些io设置的通信。例如,对于一个文件,我们可以打开文
- 人机猜拳小游戏,只要用到的java面向对象的思维模式。本游戏中有游戏玩家和计算机两个参与者。玩家和计算机都有的属性是姓名和得分。共分为4个类
- 项目开发中为了保护用户隐私安全,一般都会用MD5进行密码加密以下就简单举例SpringBoot 实现Mysql使用MD5进行密码加密做一个简
- —举例(学生排课)—正常思路的处理方法和优化过后的处理方法:比如说给学生排课。学生和课程是一个多对多的关系。按照正常的逻辑 应该有一个关联表
- 1-:生成一个签名密钥你可以用keytool命令生成一个私有密钥。在Windows上keytool命令放在JDK的bin目录中(比如C:\P
- 最近一直在写c#的时候一直遇到这个报错,看的我心烦。。。准备记下来以备后续只需。参考博客:https://segmentfault.com/
- 今天给大家带来一个自定义的底部导航,我不会做动图,只能搞一张图片给大家看看,大家见谅这个就是自定义的tablayout底部搞好的样式了Tab
- 由于机器内存坏了,换了个内存,重新安装了一个64位的Fedora16,把原来的32位的Fedora15格掉了。于是在重新安装Android
- JDK8中有双冒号的用法,就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下。代码其实很简单:以前的
- 这篇文章主要介绍了Spring Cloud Zuul添加过滤器过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 这几天做项目,有些地方的图片需要用到圆形图片,所以百度了一下,在github上找到一个开源项目,处理很简单,效果如下: 使用起来特
- 本文实例讲述了WPF的ListView控件自定义布局用法。分享给大家供大家参考,具体如下:概要:以源码的形式贴出,免得忘记后,再到网上查资料
- package com.anno;import java.lang.annotation.Retention; import j
- 1 * * 是Spring中的概念,和过滤器类似,可以对用户请求进行拦截过滤处理。但是相对于过滤器而言, * 要的控制更加的细节, *
- java抠图片文字或签名运行原理第一步 遍历像素点BufferedImage image = ImageIO.read(new File(i