效果图
涂鸦.gif
代码
class GraffitiActivity : AppCompatActivity() , View.OnTouchListener{
// 上一次触摸的位置
var lastX = 0f
var lastY = 0f
// 当前触摸的位置
var myX = 0f
var myY = 0f
lateinit var myCanvas :Canvas
// 原bitmap
lateinit var myBitmap : Bitmap
// 绘制的bitmap
lateinit var myDrawBitmap : Bitmap
var myPaint = Paint()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_graffiti)
btn1.setOnClickListener {
// 初始化 图像 画板 画笔 等资源
myBitmap = BitmapFactory.decodeResource(resources , R.mipmap.bg2)
myDrawBitmap = Bitmap.createBitmap(myBitmap.width , myBitmap.height , myBitmap.config)
myCanvas = Canvas(myDrawBitmap)
myCanvas.drawBitmap(myDrawBitmap , Matrix() , myPaint)
imageview.setImageBitmap(myDrawBitmap)
imageview.setOnTouchListener(this)
myPaint = Paint()
myPaint.setColor(Color.RED)
myPaint.strokeWidth = 10f
myPaint.setXfermode(PorterDuffXfermode(PorterDuff.Mode.CLEAR))
myCanvas.drawPaint(myPaint)
myPaint.setXfermode(PorterDuffXfermode(PorterDuff.Mode.SRC))
myCanvas.drawBitmap(myBitmap,Matrix() , myPaint)
}
btn2.setOnClickListener {
if(myDrawBitmap != null){
// 保存图片到本地
var imageUri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI , ContentValues())
var myOutStream = contentResolver.openOutputStream(imageUri!!)
myDrawBitmap.compress(Bitmap.CompressFormat.JPEG , 100 , myOutStream!!)
Toast.makeText(this,"保存成功",Toast.LENGTH_SHORT).show()
}
}
}
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
when(event!!.action){
MotionEvent.ACTION_DOWN -> {
lastX = event.x
lastY = event.y
}
MotionEvent.ACTION_UP -> {
myX = event.x
myY = event.y
myCanvas.drawLine(lastX , lastY , myX ,myY , myPaint)
imageview.invalidate()
}
MotionEvent.ACTION_MOVE -> {
myX = event.x
myY =event.y
myCanvas.drawLine(lastX , lastY , myX ,myY , myPaint)
imageview.invalidate()
lastX = myX
lastY = myY
}
}
return true
}
}
<?xml version="1.0" encoding="utf-8"?>
<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">
<Button
android:id="@+id/btn1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/btn2"
app:layout_constraintTop_toTopOf="parent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="重新绘制"/>
<Button
android:id="@+id/btn2"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@id/btn1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="保存图像"/>
<ImageView
android:id="@+id/imageview"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/btn1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:scaleType="fitXY"/>
</androidx.constraintlayout.widget.ConstraintLayout>