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

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

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

瀏覽:29日期: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蜜桃| 亚洲狼人精品一区二区三区| 欧美日韩四区| 欧美午夜网站| 蜜桃成人av| 日韩一区二区中文| 波多视频一区| 欧美黄色网页| 婷婷综合六月| 国产a亚洲精品| 国产成人精选| 国产精品伦理久久久久久| 日本蜜桃在线观看视频| 国产精品大片| 国产精品成人国产| 麻豆免费精品视频| 蜜臀国产一区| 亚洲另类黄色| 日韩一区二区三区在线看| 天堂av在线一区| 亚洲精品九九| 国产精品.xx视频.xxtv| 亚洲天堂1区| av成人国产| 综合激情在线| 久久精品国产久精国产| 国产欧美一区二区三区精品酒店| 999久久久免费精品国产| 日韩精品一卡二卡三卡四卡无卡| 蜜桃91丨九色丨蝌蚪91桃色| 天堂精品久久久久| 久久亚州av| 国产91精品对白在线播放| 久久精品福利| 日韩美女一区二区三区在线观看| 999久久久精品国产| 日本不卡不码高清免费观看| 久久免费黄色| 日韩欧美激情电影| 国产成人精品一区二区三区在线| 亚洲大全视频| 国产精品久久| 欧美精品一二| 国产欧美日韩综合一区在线播放| 播放一区二区| 久久国产人妖系列| 在线亚洲观看| 超碰在线99| 国产精品日韩| 成人三级高清视频在线看| 女人天堂亚洲aⅴ在线观看| 久久爱www.| 日韩国产欧美在线播放| 99国产精品| 国产一区二区三区国产精品| 亚洲深夜影院| 久久夜夜操妹子| 国产精品一区二区三区av| 亚洲日韩中文字幕一区| 日韩高清中文字幕一区二区| 国产精品一区二区精品视频观看| 欧美一区二区三区高清视频 | 日本va欧美va精品发布| 欧美~级网站不卡| 丰满少妇一区| 美女在线视频一区| 日韩不卡免费视频| 日韩精品福利一区二区三区| 在线精品小视频| 免费污视频在线一区| 国产一区二区三区四区五区| 久久精品国产久精国产| 国产高清精品二区| 日韩在线观看一区二区| 人人爽香蕉精品| 免费在线欧美视频| 乱人伦精品视频在线观看| 午夜精品一区二区三区国产| 成人免费一区| 国产v日韩v欧美v| 日韩欧美在线中字| 九色精品91| 蜜桃一区二区三区在线| 乱人伦精品视频在线观看| 中文字幕亚洲精品乱码| 日本视频在线一区| 国产精品jk白丝蜜臀av小说| 日本在线高清| 亚洲欧美高清| 久久精品系列| 国产在线观看www| 精品国产免费人成网站| 性感美女一区二区在线观看| 亚洲一区二区网站| 国产精品资源| 国产三级一区| 久久久精品网| 亚洲va久久久噜噜噜久久| 麻豆91小视频| 亚洲一区区二区| 国产精品videossex久久发布 | 亚洲精品动态| 国产精品亚洲片在线播放| 久久视频一区| 亚洲毛片在线免费| 青草国产精品| 亚洲男女av一区二区| 欧美日韩在线精品一区二区三区激情综合 | 日韩中文影院| 亚洲精品第一| 99久久婷婷| 99久久激情| 精品日韩一区| 日韩在线观看| 国产精品视频一区二区三区综合| 欧美一区=区| 欧美激情另类| 少妇高潮一区二区三区99| 国产中文在线播放| 69堂免费精品视频在线播放| 亚洲激情五月| 欧美日韩在线网站| 91综合视频| 亚洲免费毛片| 男女性色大片免费观看一区二区| 天堂中文在线播放| 亚洲人成在线网站| 欧美好骚综合网| 日本亚洲最大的色成网站www| 久久婷婷丁香| 国产精品黑丝在线播放| 国产精品密蕾丝视频下载| 日韩极品在线观看| 日韩中文字幕一区二区高清99| 午夜在线一区| 亚洲黄色免费看| 国产91在线精品| 精品久久久久中文字幕小说| 国产 日韩 欧美 综合 一区| 荡女精品导航| 日本а中文在线天堂| 91精品麻豆| 精品中文字幕一区二区三区四区| 午夜在线视频一区二区区别| 日韩中文字幕亚洲一区二区va在线| 蜜臀精品久久久久久蜜臀| 好看不卡的中文字幕| 性欧美69xoxoxoxo| 日韩一区欧美二区| 国产精品一区二区av交换| 麻豆国产精品| 欧美国产91| 亚州av一区| 秋霞国产精品| 中文字幕日韩亚洲| 国产精品巨作av| 亚洲女同av| 亚洲精品在线国产| 久久超级碰碰| 久久一区二区三区喷水| 国产精品日本欧美一区二区三区| 日韩av网站在线观看| 九九久久国产| 香蕉久久夜色精品国产| 国产精品永久| 欧美色图一区| 免费久久精品视频| 国产成人精品三级高清久久91| 亚洲午夜黄色| 久久wwww| 日韩精品久久久久久久软件91| 久久久久网站| 欧美成人精品午夜一区二区| 国产精品黑丝在线播放| 婷婷成人av| 亚洲天堂黄色| 91免费精品| 国产精品三p一区二区| aa国产精品| 国产免费播放一区二区| 香蕉久久久久久久av网站| 岛国av在线播放| 国产日韩欧美三区| 亚洲97av| 视频一区二区中文字幕| 精品免费在线| 欧美三级第一页| 欧美日韩国产在线一区| 精品国内亚洲2022精品成人| 免费人成黄页网站在线一区二区| 日韩av一级| 久久久久免费av| 日韩一区三区| 日韩综合一区| 高清日韩欧美| 中文字幕在线看片| 亚洲成av在线| 欧美日韩在线观看视频小说|