图片采集利用canvas的clipRect方法,图片翻转利用camera,可以根据x,y,z三轴旋转
实践代码:
package com.example.opencvapplication
import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.View
class SpinImageView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {
val paint=Paint(Paint.ANTI_ALIAS_FLAG)
val bitmap=getBitmap(200.dp)
val camera=Camera().apply {
rotateX(20f)
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
canvas?.let {
/**
* camera 旋转的坐标轴原点为手机左上角
* 图片变幻使用反向思维,先将图片的中心点平移到手的左上角然后调用camera翻转图片然后再平移回原来位置
* 然后反向实现代码
*/
//C裁剪上半部分
it.save()
it.translate(50f.dp+bitmap.width/2,50f.dp+bitmap.height/2)//移回原来位置
it.rotate(-30f)//转回原来角度
it.clipRect(-bitmap.width.toFloat(),-bitmap.height.toFloat(),bitmap.width.toFloat(),0f)//裁剪图片
it.rotate(30f)//旋转30度
it.translate((-50f).dp-+bitmap.width/2, (-50f).dp-bitmap.height/2)//将图片平移到手机左上角
it.drawBitmap(bitmap,50f.dp,50f.dp,paint)
it.restore()
it.save()
it.translate(50f.dp+bitmap.width/2,50f.dp+bitmap.height/2)//移回原来位置
it.rotate(-30f)//转回原来角度
camera.applyToCanvas(it)//翻转图片
it.clipRect(-bitmap.width.toFloat(),0f,bitmap.width.toFloat(),bitmap.height.toFloat())//裁剪图片
it.rotate(30f)//旋转30度
it.translate((-50f).dp-+bitmap.width/2, (-50f).dp-bitmap.height/2)//将图片平移到手机左上角
it.drawBitmap(bitmap,50f.dp,50f.dp,paint)
it.restore()
}
}
private fun getBitmap(width:Int): Bitmap {
val options= BitmapFactory.Options()
options.inJustDecodeBounds=true
BitmapFactory.decodeResource(resources,R.drawable.icon_tx,options)
options.inJustDecodeBounds=false
options.inDensity=options.outWidth
options.inTargetDensity=width
return BitmapFactory.decodeResource(resources,R.drawable.icon_tx,options)
}
}