Android自定义绘图板应用
作者:mobiledu2502874377 | 来源:互联网 | 2024-12-23 10:12
本文介绍如何使用Android的Canvas和View组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。
在 Android 开发中,使用 Canvas 和 View 组件可以实现丰富的图形绘制功能。本文将展示如何创建一个自定义的绘图板应用,用户可以通过触摸屏幕进行绘画,并且可以保存绘制的内容为图片。 ### 布局文件 (activity_main.xml) ```xml android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> android:layout_width="match_parent" android:layout_height="wrap_content" android:text="保存" android:OnClick="saveDrawing" /> android:id="@+id/drawingView" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> ``` ### Java 代码 (MainActivity.java) ```java package com.example.customdrawingapp; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.Toast; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends Activity { private ImageView drawingView; private Bitmap bitmap; private Canvas canvas; private Paint paint; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); drawingView = findViewById(R.id.drawingView); // 初始化画笔 paint = new Paint(); paint.setColor(Color.BLACK); paint.setStrokeWidth(5f); // 创建可修改的 Bitmap int width = getResources().getDisplayMetrics().widthPixels; int height = getResources().getDisplayMetrics().heightPixels - 200; // 考虑按钮高度 bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); canvas = new Canvas(bitmap); canvas.drawColor(Color.WHITE); // 设置触摸监听器 drawingView.setOnTouchListener((v, event) -> { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: canvas.drawPoint(x, y, paint); break; case MotionEvent.ACTION_MOVE: canvas.drawLine(x, y, x + 1, y + 1, paint); break; case MotionEvent.ACTION_UP: drawingView.setImageBitmap(bitmap); break; } return true; }); } public void saveDrawing(View view) { try { File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".png"); FileOutputStream fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.close(); Toast.makeText(this, "图片已成功保存", Toast.LENGTH_LONG).show(); // 通知系统更新媒体库 Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); intent.setData(Uri.fromFile(file)); sendBroadcast(intent); } catch (FileNotFoundException e) { Toast.makeText(this, "保存失败:文件未找到", Toast.LENGTH_LONG).show(); e.printStackTrace(); } catch (IOException e) { Toast.makeText(this, "保存失败:IO 异常", Toast.LENGTH_LONG).show(); e.printStackTrace(); } } } ``` ### 关键点说明 1. **布局文件**:我们使用 `LinearLayout` 来组织界面元素,包括一个按钮用于保存图片和一个 `ImageView` 作为绘图区域。 2. **Java 代码**:通过 `Canvas` 和 `Paint` 对象来处理绘图逻辑,监听触摸事件并实时更新 `ImageView` 中的图像内容。 3. **保存功能**:当用户点击“保存”按钮时,会将当前绘制的内容保存为图片文件,并更新系统的媒体库以确保文件可见。
推荐阅读
本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ...
[详细]
蜡笔小新 2024-12-28 09:46:23
本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ...
[详细]
蜡笔小新 2024-12-27 19:42:28
主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ...
[详细]
蜡笔小新 2024-12-27 18:18:10
在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ...
[详细]
蜡笔小新 2024-12-26 20:48:44
本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ...
[详细]
蜡笔小新 2024-12-28 10:36:30
Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ...
[详细]
蜡笔小新 2024-12-28 08:54:34
IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ...
[详细]
蜡笔小新 2024-12-27 17:02:23
本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ...
[详细]
蜡笔小新 2024-12-27 16:27:52
本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ...
[详细]
蜡笔小新 2024-12-27 16:07:12
本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ...
[详细]
蜡笔小新 2024-12-27 13:14:08
本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ...
[详细]
蜡笔小新 2024-12-27 10:34:22
在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ...
[详细]
蜡笔小新 2024-12-27 09:27:14
RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ...
[详细]
蜡笔小新 2024-12-26 20:24:01
学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ...
[详细]
蜡笔小新 2024-12-26 20:04:36
在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ...
[详细]
蜡笔小新 2024-12-26 13:43:24
mobiledu2502874377
这个家伙很懒,什么也没留下!