canvas drawBitmap 绘制不规则圆角 - 有倾斜度

canvas drawBitmap 绘制不规则圆角 - 有倾斜度



CircularCornerFragment类:

package com.example.androidkotlindemo2.circular

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.PaintFlagsDrawFilter
import android.graphics.Path
import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode
import android.graphics.Rect
import android.graphics.RectF
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.RequiresApi
import androidx.core.graphics.toRectF
import androidx.fragment.app.Fragment
import com.example.androidkotlindemo2.R
import com.example.androidkotlindemo2.databinding.CircularCornerMainBinding


/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2024/8/31 11:42
 * Description : 不正规圆角
 */
class CircularCornerFragment :Fragment(), View.OnClickListener {

    private lateinit var binding : CircularCornerMainBinding

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = CircularCornerMainBinding.inflate(inflater, container, false)
        return binding.root
    }


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.circularCornerBtn1.setOnClickListener(this)
        binding.circularCornerBtn2.setOnClickListener(this)
        binding.circularCornerBtn3.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        v?:return
        if(v.id == R.id.circular_corner_btn1){
            test1()
        } else if(v.id == R.id.circular_corner_btn2){
            test2()
        } else if(v.id == R.id.circular_corner_btn3){
            test3()
        }
    }

    private fun test3(){
        val originalBitmap = BitmapFactory.decodeResource(resources, R.mipmap.base_banner1)
        val cornerRadius = 50 // 设置圆角的半径

        var roundedCornerBitmap = getRoundedCornerBitmap3(originalBitmap, cornerRadius)
        binding.circularCornerImg1.setImageBitmap(roundedCornerBitmap)
    }

    /**
     * 使用lineTo绘制圆角
     */
    private fun createRoundedCornerPath3(rect: RectF, cornerRadius: Float): Path {
        val path = Path()
        path.moveTo(rect.left + cornerRadius, rect.top) // 起点在左上角
        path.lineTo(rect.right - cornerRadius, rect.top+ cornerRadius*1) // 直线到右上角
        // 使用quadTo方法添加圆角
        path.quadTo(rect.right, rect.top+ cornerRadius*1, rect.right, rect.top + cornerRadius*2)
        path.lineTo(rect.right, rect.bottom - cornerRadius)
        path.quadTo(rect.right, rect.bottom, rect.right - cornerRadius, rect.bottom)
        path.lineTo(rect.left + cornerRadius, rect.bottom)
        path.quadTo(rect.left, rect.bottom, rect.left, rect.bottom - cornerRadius)
        path.lineTo(rect.left, rect.top + cornerRadius)
        path.quadTo(rect.left, rect.top, rect.left + cornerRadius, rect.top)
        path.close()
        return path
    }

    private fun getRoundedCornerBitmap3(bitmap: Bitmap, cornerRadius: Int): Bitmap {
        val output = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
        val canvas = Canvas(output)
        //canvas 设置抗锯齿
        canvas.drawFilter = PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG)
        val paint = Paint()
        val rect = Rect(0, 0, bitmap.width, bitmap.height)
        //是用来防止边缘的锯齿,
        paint.isAntiAlias = true
        //函数是用来对位图进行滤波处理
        paint.isFilterBitmap = true
        var path = createRoundedCornerPath3(rect.toRectF(), cornerRadius.toFloat())
        canvas.drawPath(path, paint)
        paint.setXfermode(PorterDuffXfermode(PorterDuff.Mode.SRC_IN))
        canvas.drawBitmap(bitmap, rect, rect, paint)

        return output
    }

    private fun test2(){
        val originalBitmap = BitmapFactory.decodeResource(resources, R.mipmap.base_banner1)
        val cornerRadius = 50 // 设置圆角的半径
        val roundedCornerBitmap = getRoundedCornerBitmap2(originalBitmap, cornerRadius)
        binding.circularCornerImg1.setImageBitmap(roundedCornerBitmap)
    }



    private fun test1(){
        val originalBitmap = BitmapFactory.decodeResource(resources, R.mipmap.base_banner1)
        val cornerRadius = 50 // 设置圆角的半径
        val roundedCornerBitmap = getRoundedCornerBitmap(originalBitmap, cornerRadius)
        binding.circularCornerImg1.setImageBitmap(roundedCornerBitmap)
    }

    
    private fun getRoundedCornerBitmap2(bitmap: Bitmap, cornerRadius: Int): Bitmap {
        val output = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
        val canvas = Canvas(output)

        val color = -0xbdbdbe
        val paint = Paint()
        val rect = Rect(0, 0, bitmap.width, bitmap.height)
        val rectF = RectF(rect)
        val roundPx = cornerRadius.toFloat()

        paint.isAntiAlias = true
        canvas.drawARGB(0, 0, 0, 0)
        paint.color = color

        //canvas.drawRoundRect(rectF, roundPx, roundPx, paint)
        var path = Path()
        //var radii = arrayOf(20, 30, 40, 50, 60, 70, 80, 90)
        //var radii = floatArrayOf(20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f)
        //var radii = floatArrayOf(60.0f, 60.0f, 60.0f, 60.0f, 60.0f, 60.0f, 120.0f, 120.0f)
        //var radii = floatArrayOf(60.0f, 60.0f, 680.0f, 120.0f,120.0f,180.0f,180.0f,180.0f, 60.0f, 60.0f, 60.0f, 60.0f)
        var radii = floatArrayOf(60.0f, 60.0f, 680.0f, 60.0f, 60.0f, 60.0f, 60.0f, 60.0f)
        //path.addRoundRect(rectF, radii, Path.Direction.CW)
        path.moveTo(60.0f, 60.0f)
        path.lineTo(680.0f, 120.0f)
        path.lineTo(680.0f, 480.0f)
        path.lineTo(60.0f, 480.0f)
        path.lineTo(60.0f, 60.0f)
        path.close()

        //path.addRoundRect(rectF, radii, Path.Direction.CW)

        canvas.drawPath(path, paint)

        paint.setXfermode(PorterDuffXfermode(PorterDuff.Mode.SRC_IN))
        canvas.drawBitmap(bitmap, rect, rect, paint)

        return output
    }

    private fun getRoundedCornerBitmap(bitmap: Bitmap, cornerRadius: Int): Bitmap {
        val output = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
        val canvas = Canvas(output)

        val color = -0xbdbdbe
        val paint = Paint()
        val rect = Rect(0, 0, bitmap.width, bitmap.height)
        val rectF = RectF(rect)
        val roundPx = cornerRadius.toFloat()

        paint.isAntiAlias = true
        canvas.drawARGB(0, 0, 0, 0)
        paint.color = color

        canvas.drawRoundRect(rectF, roundPx, roundPx, paint)

        paint.setXfermode(PorterDuffXfermode(PorterDuff.Mode.SRC_IN))
        canvas.drawBitmap(bitmap, rect, rect, paint)

        return output
    }


}

circular_corner_main.xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textColor="@color/red"
        android:textSize="30sp"
        android:text="不正规圆角"/>

    <Button
        android:id="@+id/circular_corner_btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="圆角1"/>

    <Button
        android:id="@+id/circular_corner_btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="不规则圆角2"/>

    <Button
        android:id="@+id/circular_corner_btn3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="不规则圆角3 - 有效果"/>

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/circular_corner_img1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_gravity="center"
        android:src="@mipmap/base_banner0"/>


</LinearLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六毛六66

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值