package org.example.widgets;
import org.example.R;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
public class TagTextView extends TextView {
private static final int DEFAULT_BORDER_WIDTH = 0;
private static final int DEFAULT_RADIUS_SIZE = 0;
private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
private float mRadius;
private ColorStateList mBorderColor = ColorStateList.valueOf(DEFAULT_BORDER_COLOR);
private float mBorderWidth = DEFAULT_BORDER_WIDTH;
public TagTextView(Context context) {
this(context, null);
}
public TagTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TagTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TagTextView, defStyleAttr, 0);
mRadius = ta.getDimensionPixelSize(R.styleable.TagTextView_border_radius, DEFAULT_RADIUS_SIZE);
ta.recycle();
init();
}
/**
* 初始化View
*
* @throws IllegalStateException
*/
@SuppressWarnings("deprecation")
private void init() {
// 关闭硬件加速,否则会导致Xfermode混合成的透明背景为黑色
if (android.os.Build.VERSION.SDK_INT >= 11) {
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mRadius > 0) {
Bitmap bitmap = generateMaskBitmap();
Paint bitmapPaint = new Paint();
bitmapPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(bitmap, 0f, 0f, bitmapPaint);
bitmap.recycle();
}
// 画边框
if (mBorderWidth > 0) {
Paint borderPaint = new Paint();
borderPaint.setStyle(Paint.Style.STROKE);
borderPaint.setAntiAlias(true);
borderPaint.setColor(mBorderColor.getColorForState(getDrawableState(), DEFAULT_BORDER_COLOR));
borderPaint.setStrokeWidth(mBorderWidth);
RectF borderRect = new RectF(0, 0, getWidth(), getHeight());
// 向内偏移边框的位置,否则会超出画布
borderRect.inset(mBorderWidth / 2, mBorderWidth / 2);
canvas.drawRoundRect(borderRect, mRadius, mRadius, borderPaint);
}
}
/**
* 生成一张圆角矩形的掩盖图片
*
* @return Bitmap
*/
public Bitmap generateMaskBitmap() {
Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Canvas bitmapCanvas = new Canvas(bitmap);
RectF r = new RectF(0, 0, getWidth(), getHeight());
Rect rect = new Rect(0, 0, getWidth(), getHeight());
Paint bitmapPaint = new Paint();
bitmapPaint.setAlpha(0);
bitmapPaint.setColor(Color.TRANSPARENT);
bitmapCanvas.drawRect(rect, bitmapPaint);
bitmapPaint.reset();
bitmapPaint.setStyle(Paint.Style.FILL);
bitmapPaint.setAntiAlias(true);
bitmapPaint.setColor(Color.WHITE);
bitmapCanvas.drawRoundRect(r, mRadius, mRadius, bitmapPaint);
return bitmap;
}
/**
* 设置边框的颜色
*
* @param colors
*/
public void setBorderColor(ColorStateList colors) {
if (mBorderColor.equals(colors)) {
return;
}
if (mBorderWidth > 0) {
invalidate();
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
AarExample.zip (77个子文件)
Example
.gitignore 98B
app
.gitignore 8B
build.gradle 635B
src
androidTest
java
org
example
ApplicationTest.java 354B
main
AndroidManifest.xml 778B
res
mipmap-xhdpi
ic_launcher.png 5KB
mipmap-mdpi
ic_launcher.png 2KB
layout
activity_main.xml 996B
values-w820dp
dimens.xml 364B
mipmap-xxhdpi
ic_launcher.png 8KB
menu
menu_main.xml 402B
drawable
libs
mipmap-hdpi
ic_launcher.png 3KB
values
strings.xml 183B
attrs.xml 216B
dimens.xml 216B
styles.xml 202B
java
org
example
activitys
MainActivity.java 495B
widgets
TagTextView.java 4KB
libs
proguard-rules.pro 679B
app.iml 7KB
settings.gradle 46B
build.gradle 525B
gradlew 5KB
framework
.gitignore 8B
build.gradle 1KB
src
androidTest
java
org
framework
ApplicationTest.java 421B
main
AndroidManifest.xml 322B
res
drawable
values
strings.xml 145B
java
org
framework
framework.iml 8KB
libs
drawee-pipeline-0.6.1.aar 9KB
drawee-volley-0.6.1.aar 9KB
fbcore-0.6.1.aar 87KB
drawee-0.6.1.aar 85KB
imagepipeline-0.6.1.aar 3.28MB
imagepipeline-okhttp-0.6.1.aar 8KB
proguard-rules.pro 679B
custwidgets
.gitignore 8B
build.gradle 661B
src
androidTest
java
org
custwidgets
ApplicationTest.java 423B
main
AndroidManifest.xml 324B
res
drawable
values
strings.xml 147B
java
org
custwidgets
custwidgets.iml 8KB
libs
proguard-rules.pro 679B
Example.iml 938B
gradlew.bat 2KB
gradle.properties 1009B
.gradle
2.4
taskArtifacts
fileSnapshots.bin 4.46MB
fileHashes.bin 320KB
outputFileStates.bin 23KB
taskArtifacts.bin 139KB
cache.properties.lock 17B
cache.properties 31B
.idea
misc.xml 3KB
encodings.xml 159B
libraries
support_annotations_22_2_0.xml 529B
appcompat_v7_22_2_0.xml 802B
drawee_pipeline_0_6_1_.xml 409B
bolts_android_1_1_4.xml 542B
library_2_4_0.xml 520B
jsr305_3_0_0.xml 330B
support_v4_22_2_0.xml 952B
fbcore_0_6_1_.xml 382B
javax_annotation_api_1_2.xml 358B
drawee_0_6_1_.xml 382B
imagepipeline_0_6_1_.xml 403B
workspace.xml 258KB
gradle.xml 813B
vcs.xml 164B
copyright
profiles_settings.xml 214B
Baidu.xml 374B
runConfigurations.xml 564B
compiler.xml 709B
.name 7B
modules.xml 601B
gradle
wrapper
gradle-wrapper.properties 236B
gradle-wrapper.jar 49KB
local.properties 477B
共 77 条
- 1
鱼塘鱼汤
- 粉丝: 97
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 探索微软新VLM Phi-3 Vision模型:详细分析与代码示例
- 前端开发美信射频前端开发板开发资料美信射频前端开发板开发资料
- 【mysql开发】使用ssm框架+mysql开发,这是一个J2ee项目
- 图像处理MATLAB图像处理,matlab图像处理的基本程序
- 专题讲解:信噪比和噪声系数
- 【matlab仿真】MATLAB入门仿真材料 MATLAB入门仿真材料
- Buffer of Thoughts: Thought-Augmented Reasoning with Large Langu
- 易语言抢购源码,京东抢购助手源码+模块打包
- feeds_tab_manager_simpleTabListCache
- 智能车竞赛四轮组资料 含程序代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
前往页