Android自定义文件路径箭头,android自定义带箭头对话框

本文实例为大家分享了android自定义带箭头对话框的具体代码,供大家参考,具体内容如下

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Path;

import android.support.annotation.Nullable;

import android.util.AttributeSet;

import android.view.Gravity;

import com.sankuai.shangou.stone.util.DensityUtil;

import com.sankuai.waimai.store.search.R;

/**

* Created by Android Studio. User: liangyongyao Date: 2021/3/7 Des: 带倒三角的气泡

*/

public class BubbleArrowTextView extends android.support.v7.widget.AppCompatTextView {

private final static int TRIANGLE_DIRECTION_TOP = 1;

private final static int TRIANGLE_DIRECTION_BOTTOM = 2;

private final static int TRIANGLE_DIRECTION_LEFT = 1;

private final static int TRIANGLE_DIRECTION_RIGHT = 2;

private Paint mPaint;

private Paint mStrokePaint;

private int mBgColor;

private int mStrokeColor;

private int mStrokeWidth;

private int mTotalHeight;

private int mTotalWidth;

private int mLabelHeight;

private int mTriangleHeight;

private int mTriangleWidth;

private int mRadius;

private int triangleDirection;

public BubbleArrowTextView(Context context) {

this(context, null);

}

public BubbleArrowTextView(Context context,

@Nullable AttributeSet attrs) {

this(context, attrs, 0);

}

public BubbleArrowTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init(context, attrs, defStyleAttr);

}

public void init(Context context, AttributeSet attrs, int defStyleAttr) {

if (attrs != null) {

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BubbleArrowTextView);

mBgColor = a.getColor(R.styleable.BubbleArrowTextView_bubbleColor, 0);

mStrokeColor = a.getColor(R.styleable.BubbleArrowTextView_bubbleStrokeColor, 0);

mRadius = a.getDimensionPixelOffset(R.styleable.BubbleArrowTextView_bubbleRadius, 0);

mStrokeWidth = a.getDimensionPixelOffset(R.styleable.BubbleArrowTextView_bubbleStrokeWidth, 0);

mTriangleHeight = a.getDimensionPixelOffset(R.styleable.BubbleArrowTextView_triangleHeight,

DensityUtil.dip2px(context, 6));

mTriangleWidth = a.getDimensionPixelOffset(R.styleable.BubbleArrowTextView_triangleWidth, DensityUtil.dip2px(context, 3.5f));

triangleDirection = a.getInt(R.styleable.BubbleArrowTextView_triangleDirection, 0);

a.recycle();

}

setGravity(Gravity.CENTER);

initPaint();

}

//初始化画笔

public void initPaint() {

mPaint = new Paint();

mPaint.setAntiAlias(true);

mPaint.setStyle(Paint.Style.FILL);

mPaint.setTextSize(getPaint().getTextSize());

mPaint.setDither(true);

}

//初始化边框线画笔

public void initStrokePaint() {

mStrokePaint = new Paint();

mStrokePaint.setAntiAlias(true);

mStrokePaint.setStyle(Paint.Style.FILL);

mStrokePaint.setDither(true);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

mLabelHeight = getFontHeight() + getPaddingTop() + getPaddingBottom();

mTotalHeight = mLabelHeight + mTriangleHeight * 2 + mStrokeWidth * 2;

mTotalWidth = getPaddingLeft() + getFontWidth() + getPaddingRight() + mStrokeWidth * 2;

setMeasuredDimension(mTotalWidth, mTotalHeight);

}

@Override

protected void onDraw(Canvas canvas) {

drawView(canvas);

super.onDraw(canvas);

}

//绘制气泡

private void drawView(Canvas canvas) {

if (mStrokeColor != 0 && mStrokeWidth != 0) {

initStrokePaint();

mStrokePaint.setColor(mStrokeColor);

drawRound(canvas, mStrokePaint, 0);

drawTriangle(canvas, mStrokePaint, 0);

}

if (mBgColor != 0) {

mPaint.setColor(mBgColor);

drawRound(canvas, mPaint, mStrokeWidth);

drawTriangle(canvas, mPaint, mStrokeWidth);

}

}

//绘制矩形

private void drawRound(Canvas canvas, Paint paint, int strokeWidth) {

canvas.drawRoundRect(strokeWidth, mTriangleHeight + strokeWidth,

mTotalWidth - strokeWidth, mTotalHeight - mTriangleHeight - strokeWidth,

mRadius, mRadius, paint);

}

//绘制三角形

private void drawTriangle(Canvas canvas, Paint paint, int strokeWidth) {

Path path = new Path();

switch (triangleDirection) {

//上

case TRIANGLE_DIRECTION_TOP:

path.moveTo(mTotalWidth * 0.8f - mTriangleWidth / 2 + strokeWidth / 2, mTriangleHeight + strokeWidth);

path.lineTo(mTotalWidth * 0.8f, strokeWidth + strokeWidth / 2);

path.lineTo(mTotalWidth * 0.8f + mTriangleWidth / 2 - strokeWidth / 2, mTriangleHeight + strokeWidth);

break;

//下

case TRIANGLE_DIRECTION_BOTTOM:

path.moveTo(mTotalWidth * 0.8f - mTriangleWidth/2 + strokeWidth / 2, mTotalHeight - mTriangleHeight

- strokeWidth);

path.lineTo(mTotalWidth * 0.8f, mTotalHeight - strokeWidth - strokeWidth / 2);

path.lineTo(mTotalWidth * 0.8f + mTriangleWidth/2 - strokeWidth / 2, mTotalHeight - mTriangleHeight

- strokeWidth);

break;

default:

return;

}

canvas.drawPath(path, paint);

}

//根据字号求字体高度

private int getFontHeight() {

Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();

return Math.round(fontMetrics.descent - fontMetrics.ascent);

}

//根据字号求字体宽度

private int getFontWidth() {

return (int) mPaint.measureText(getText().toString());

}

}

xml:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值