返回

画龙点睛,让写字板妙笔生花!

Android

Android自定义控件的魅力:打造你的专属写字板

Android自定义控件 是构建丰富交互式用户界面的利器。而其中,写字板 便是一个绝佳的展示案例。本文将逐步引导你打造自己的Android写字板,并教你如何保存图片,让你的创作永久留存。

构建基本写字板

首先,创建一个新的Android项目,并在布局文件中添加一个画布(Canvas) 组件。这块画布就是你挥洒创意的天地。

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

接着,创建一个自定义View类 来处理绘图逻辑。该类继承自View类并实现onDraw()方法。

class WritingPadView(context: Context) : View(context) {

    private var path: Path = Path()
    private var paint: Paint = Paint()

    init {
        paint.style = Paint.Style.STROKE
        paint.strokeWidth = 5f
        paint.color = Color.BLACK
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        canvas.drawPath(path, paint)
    }

    fun clear() {
        path.reset()
        invalidate()
    }

}

自定义View类包含绘制路径和画笔属性,并在onDraw()方法中将路径绘制到画布上。

添加触摸事件处理

为了让用户在画布上挥洒自如,我们需要添加触摸事件处理。在自定义View类中重写onTouchEvent()方法。

override fun onTouchEvent(event: MotionEvent): Boolean {
    when (event.action) {
        MotionEvent.ACTION_DOWN -> {
            path.moveTo(event.x, event.y)
            return true
        }
        MotionEvent.ACTION_MOVE -> {
            path.lineTo(event.x, event.y)
            invalidate()
            return true
        }
        MotionEvent.ACTION_UP -> return true
    }
    return super.onTouchEvent(event)
}

此方法监听用户的触摸事件,并根据不同的动作(按下、移动、抬起)更新路径。

保存图片

要保存图片,我们需要借助Bitmap 类。首先创建一个Bitmap对象来存储画布内容。

val bitmap = Bitmap.createBitmap(canvas.width, canvas.height, Bitmap.Config.ARGB_8888)

然后创建一个画布对象,将画布内容复制到Bitmap中。

val bitmapCanvas = Canvas(bitmap)
canvas.draw(bitmapCanvas)

最后,将Bitmap保存到文件中。

try {
    val fos = FileOutputStream(file)
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
    fos.close()
} catch (e: Exception) {
    e.printStackTrace()
}

恭喜你!你现在拥有了一个能保存图片的写字板啦!

常见问题解答

  • 如何更改画笔颜色?
    在自定义View类中,可以使用paint.setColor()方法更改画笔颜色。

  • 如何更改画笔宽度?
    在自定义View类中,可以使用paint.setStrokeWidth()方法更改画笔宽度。

  • 如何清除画布?
    在自定义View类中,可以使用path.reset()方法清除画布。

  • 如何保存图片到特定文件夹?
    可以使用Environment.getExternalStorageDirectory()方法获取外部存储根目录,然后使用File.mkdirs()方法创建所需的文件夹。

  • 如何让画笔跟随手指移动?
    onTouchEvent()方法的ACTION_MOVE分支中,将手指当前位置(event.xevent.y)作为路径的终点,并调用invalidate()方法刷新画布。