Android图片涂鸦,Kotlin(1)
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Path
import android.graphics.PointF
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.appcompat.widget.AppCompatImageView
class PaintView @JvmOverloads constructor(
attrs: AttributeSet? = null,
) : AppCompatImageView(context!!, attrs, defStyleAttr) {
private var mPaint: Paint? = null
private var mPath: Path? = null
private var mPaintWidth = 10
private var mColor = Color.RED
private val mDrawPathList: ArrayList?
private val mSavePathList: ArrayList?
const val TAG = "PaintView"
mDrawPathList = ArrayList()
mSavePathList = ArrayList()
private fun initPaint() {
mPaint?.isAntiAlias = true
mPaint?.strokeWidth = mPaintWidth.toFloat()
mPaint?.style = Paint.Style.STROKE
override fun onDraw(canvas: Canvas) {
if (!mDrawPathList.isNullOrEmpty()) {
for (drawPath in mDrawPathList) {
if (drawPath.path != null) {
canvas.drawPath(drawPath.path!!, drawPath.paint!!)
drawPath.points.forEach {
Log.d(TAG, "onDraw ${drawPath.id} ${it.x} ${it.y}")
override fun onTouchEvent(event: MotionEvent): Boolean {
MotionEvent.ACTION_DOWN -> {
Log.d(TAG, "ACTION_DOWN ${event.x} ${event.y}")
mPath?.moveTo(mDownX, mDownY)
val drawPath = DrawPath()
drawPath.id = System.currentTimeMillis()
mDrawPathList?.add(drawPath)
drawPath.points.add(PointF(event.x, event.y))
MotionEvent.ACTION_MOVE -> {
mPath?.quadTo(mTempX, mTempY, moveX, moveY)
it.points.add(PointF(event.x, event.y))
MotionEvent.ACTION_UP -> {
Log.d(TAG, "ACTION_UP ${event.x} ${event.y}")
if (mDrawPathList != null && mDrawPathList.size >= 1) {
mSavePathList?.add(mDrawPathList[mDrawPathList.size - 1])
mDrawPathList.removeAt(mDrawPathList.size - 1)
if (!mSavePathList.isNullOrEmpty()) {
mDrawPathList?.add(mSavePathList[mSavePathList.size - 1])
mSavePathList.removeAt(mSavePathList.size - 1)
fun setPaintColor(color: Int) {
mPaint?.color = this.mColor
fun setPaintWidth(size: Int) {
mPaint?.strokeWidth = mPaintWidth.toFloat()
fun enlargePaintWidth() {
mPaintWidth += WIDTH_INCREMENT
mPaint?.strokeWidth = mPaintWidth.toFloat()
fun getDrawPath(): ArrayList? {
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/paint_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitCenter"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
android:id="@+id/rl_left"
android:layout_width="100dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
android:id="@+id/btn_undo"
android:layout_width="match_parent"
android:layout_height="60dp"
android:id="@+id/btn_red"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_below="@id/btn_undo"
android:id="@+id/btn_green"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_below="@id/btn_red"
android:id="@+id/btn_enlarge"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_below="@id/btn_green"
androidx.constraintlayout.widget.ConstraintLayout>
Android图形图像处理:添加涂鸦文字_android 在图片上涂鸦-CSDN博客文章浏览阅读2k次。先看运行效果: 关键的PaintView:package com.zhangphil;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graph..._android 在图片上涂鸦
https://blog.csdn.net/zhangphil/article/details/87810653