日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

android自定義帶箭頭對(duì)話框

瀏覽:26日期:2022-09-20 16:22:11

本文實(shí)例為大家分享了android自定義帶箭頭對(duì)話框的具體代碼,供大家參考,具體內(nèi)容如下

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); } //根據(jù)字號(hào)求字體高度 private int getFontHeight() { Paint.FontMetrics fontMetrics = mPaint.getFontMetrics(); return Math.round(fontMetrics.descent - fontMetrics.ascent); } //根據(jù)字號(hào)求字體寬度 private int getFontWidth() { return (int) mPaint.measureText(getText().toString()); }}

xml:

<declare-styleable name='BubbleArrowTextView'> <attr name='bubbleColor' format='reference|color' /> <attr name='bubbleStrokeColor' format='reference|color' /> <attr name='bubbleStrokeWidth' format='dimension' /> <attr name='triangleHeight' format='dimension' /> <attr name='triangleWidth' format='dimension' /> <attr name='bubbleRadius' format='dimension' /> <attr name='triangleDirection'> <flag name='top' value='1' /> <flag name='bottom' value='2' /> </attr></declare-styleable>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美精品影院| 99久久www免费| 黄色欧美日韩| 黑丝一区二区三区| 1024精品久久久久久久久| 91精品推荐| 欧美a级一区| 久久国产精品亚洲77777| 日韩一区精品| 国内自拍视频一区二区三区| 国产麻豆久久| 国产精品视频一区二区三区四蜜臂| 四虎4545www国产精品 | 午夜在线视频一区二区区别| 国产一区亚洲| 日韩午夜免费| 国产传媒在线观看| 国产一区国产二区国产三区 | 日本va欧美va精品发布| 欧美aaaaaa午夜精品| 99精品视频在线| 亚洲精品黄色| 老牛影视精品| 亚洲区国产区| 中文字幕在线高清| 亚洲伊人精品酒店| 国产精品国产三级国产在线观看| 99国产精品私拍| 国产精品一级| 精品深夜福利视频| 日韩欧美一区二区三区免费看| 久久精品亚洲欧美日韩精品中文字幕| 老司机免费视频一区二区三区| 国产精品va视频| 蜜臀av免费一区二区三区| 日韩精品欧美大片| 91精品国产自产在线观看永久∴| 深夜日韩欧美| 亚洲福利久久| 九九久久国产| 综合视频一区| 激情自拍一区| 国产aⅴ精品一区二区三区久久| 另类国产ts人妖高潮视频| 国产在视频一区二区三区吞精| 蜜臀91精品一区二区三区| 午夜av不卡| 国产精品igao视频网网址不卡日韩| 性一交一乱一区二区洋洋av| 粉嫩av一区二区三区四区五区 | 免费在线观看一区二区三区| 91看片一区| 亚洲精一区二区三区| 欧美一区二区性| 精品一区视频| 欧美色综合网| 蜜臀久久99精品久久久久宅男| 国产精品亚洲一区二区三区在线观看| 欧美日韩一区二区高清| 91久久中文| 日韩一区亚洲二区| 免费在线观看一区| 欧美一级一区| 玖玖玖国产精品| 99精品国产一区二区三区| 精品精品久久| 国产精品香蕉| 日韩高清一区| 亚洲精选av| 视频精品一区二区| 亚洲精品黄色| 三级在线观看一区二区| 亚洲精品网址| 亚洲一本视频| 99精品在线免费在线观看| 久久uomeier| 日本激情一区| 久久精品色播| 国产欧美日韩一级| 日韩va亚洲va欧美va久久| 水野朝阳av一区二区三区| 亚洲大片在线| 欧美综合另类| 午夜av一区| 九一精品国产| 亚洲成人日韩| 五月天久久久| 91久久黄色| 国产精品免费看| 亚洲精品一二三区区别| 欧洲激情综合| 亚洲二区视频| 99热国内精品| 日韩一区二区三区在线免费观看| 国产成人久久| 久久久久免费| 成人福利av| 91精品推荐| 亚洲香蕉网站| 中日韩男男gay无套| 红桃视频国产精品| 性一交一乱一区二区洋洋av| 美女国产一区| 日韩激情网站| 国产精品香蕉| 国产一区二区三区不卡视频网站| 精品九九久久| 亚洲女同av| 日韩精品免费一区二区三区| 日本高清不卡一区二区三区视频| 精品欧美一区二区三区在线观看| 欧美不卡高清一区二区三区| 国产综合色产| 亚洲在线观看| 日韩国产91| 久久精品国产网站| 色老板在线视频一区二区| 免费视频亚洲| 中文字幕亚洲精品乱码| 国产亚洲一区| 欧美好骚综合网| 91精品91| 日韩久久一区| 国产精品777777在线播放| 久久精品国产免费| 在线天堂资源www在线污| 亚洲精品在线影院| 在线视频精品| 青青国产精品| 久草免费在线视频| 欧美日韩精品一本二本三本| 亚洲美女久久| 麻豆91精品91久久久的内涵| 日韩精品麻豆| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产欧美一级| 精品捆绑调教一区二区三区| 香蕉久久国产| 国产美女亚洲精品7777| 国产66精品| 亚洲视频播放| 国产精品红桃| 久久五月天小说| 日韩精品第二页| 日韩精品诱惑一区?区三区| 尹人成人综合网| 日韩精品免费观看视频| 久久精品福利| 另类av一区二区| 久久精品网址| 蜜桃久久av| 精品美女在线视频| 日韩天堂av| 国产精品一区二区三区美女| 成人日韩在线观看| 日本成人手机在线| 久久精品动漫| 国产日韩一区| 伊人精品一区| 国产精品xxx在线观看| 美女少妇全过程你懂的久久| 日韩激情一区二区| 色婷婷精品视频| 日本a口亚洲| 久久精品主播| 国产精品扒开腿做爽爽爽软件| 激情综合网址| 麻豆成人av在线| 午夜一区在线| 91亚洲国产成人久久精品| 亚洲最大av| 久久久国产精品一区二区中文| 欧美日韩精品一区二区三区在线观看| 日韩欧美一区二区三区在线观看| 日韩高清不卡在线| 久久精品欧美一区| 国产精品片aa在线观看| 亚洲精品一区二区在线看| 狠狠久久伊人| 日韩激情网站| 久久av一区| 日韩精品不卡一区二区| 国产日产一区| 久久aⅴ国产紧身牛仔裤| www在线观看黄色| 国产欧美一区二区三区米奇| 99视频一区| 亚洲成人一区在线观看| 欧美激情视频一区二区三区在线播放| 最新日韩av| 电影亚洲精品噜噜在线观看| 国产精品乱战久久久| 视频一区二区三区在线| 91精品亚洲| 国产精品原创| 国产高清日韩| 青青国产91久久久久久| 麻豆亚洲精品| 亚洲精品成人| av中文资源在线资源免费观看|