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>