<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 1. 前言 對于模式:PorterDuff.Mode.SRC_OUT; 計算方式為:\[Sa \* (1 - Da), Sc \* (1 - Da)\],表示如果相交處的目標色的alpha是完全不透明的,這時候源圖像會完全被過濾掉,否則會受到相交處目標色 alpha 影響,呈現出對應色值。 也就是繪圖效果取決于目標圖的不透明度Da,如果源圖像和目標圖像不相交,那么就繪制源圖,否則就根據公式計算出對應的圖像值。 根據這個效果,我們就可以嘗試做一個橡皮擦效果。也就是將要擦除的圖像作為源圖,將手指繪制的區域作為目標圖,然后動態繪制手指的范圍,根據公式,如果兩圖之間的目標圖不透明度為1,那么就計算為0,可以達到清除的目的。 ~~~ class PorterDuffXfermodeDemo3 : View { constructor(context: Context?) : super(context) { init() } constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { init() } constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( context, attrs, defStyleAttr ) { init() } private lateinit var mRectPaint: Paint private lateinit var mRect: Rect private val resBitmap = BitmapFactory.decodeResource(resources, R.drawable.logo) private val mPath = Path() private fun init() { mRect = Rect(200, 200, 400, 400) mRectPaint = Paint() mRectPaint.isAntiAlias = true mRectPaint.color = Color.RED mRectPaint.isDither = true mRectPaint.strokeWidth = 30f mRectPaint.style = Paint.Style.STROKE // 關閉硬件加速 setLayerType(LAYER_TYPE_SOFTWARE, null) } // 記錄坐標 private var mX = 0f private var mY = 0f override fun onTouchEvent(event: MotionEvent?): Boolean { var flag = super.onTouchEvent(event) when(event?.action){ MotionEvent.ACTION_DOWN -> { mX = event.x mY = event.y mPath.moveTo(mX, mY) flag = true } MotionEvent.ACTION_MOVE -> { val cX = event.x val cY = event.y val midX = (cX + mX) / 2 val midY = (cY + mY) / 2 mPath.quadTo(midX, midY, cX, cY) mX = cX mY = cY invalidate() } MotionEvent.ACTION_UP -> { mX = event.x mY = event.y mPath.lineTo(mX, mY) } } return flag } override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) canvas?.apply { // this == canvas // 新建圖層 val saveLayerId = saveLayer(0f, 0f, width.toFloat(), height.toFloat(), mRectPaint) // 繪制源圖 canvas.drawBitmap(resBitmap, 100f, 100f, mRectPaint) // 設置圖像混合模式 mRectPaint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_OUT) // 繪制目標圖像 drawPath(mPath, mRectPaint) // 清空圖像混合模式 mRectPaint.xfermode = null restoreToCount(saveLayerId) } } } ~~~ 效果,比如在圖上畫個S: ![](https://img.kancloud.cn/79/5d/795d164cd22ae8e1b1ce0e0d6cf6ebc8_261x259.png) 當然,這里為了觀察方便,可以為圖層指定一個顏色: ![](https://img.kancloud.cn/c0/f5/c0f57c32133a24df36db70994a0d2786_281x264.png) 當然,可以為畫筆指定一個圓角特效: ~~~ // 設置畫筆圓角特效 mRectPaint.pathEffect = CornerPathEffect(100f) ~~~ 同樣的,也可以指定線帽樣式: ~~~ // 設置線帽樣式為圓角 mRectPaint.strokeCap = Paint.Cap.ROUND ~~~ 效果: ![](https://img.kancloud.cn/13/13/1313379fd721c855dbcb5d49ccbc5331_270x252.png) 從上圖中可以看出,如果我們擦除了圖片那么,底層就是畫布的背景顏色,所以我們如果可以在其后預先設置一個背景文字,就可以做到刮刮樂效果了。比如這里做簡單修改onDraw: ~~~ drawColor(Color.GRAY) drawText("Hello", 200f, 200f, mRectPaint) ... ~~~ 然后調整一下字體大小、線條粗細和顏色: ~~~ mRectPaint.strokeWidth = 18f mRectPaint.textSize = 100f mRectPaint.color = Color.BLACK ~~~ 效果: ![](https://img.kancloud.cn/60/8c/608c6b8fd77774d1b6e404c216658e41_273x260.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看