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

您的位置:首頁技術文章
文章詳情頁

Android實現梯形TextView效果

瀏覽:92日期:2022-09-18 13:46:58
目錄效果圖:自定義代碼實現邏輯:要點分析1.背景與文本內容的繪制2.梯形范圍內外的點擊事件處理3.其它自定義屬性效果圖:

Android實現梯形TextView效果

自定義代碼實現邏輯:

public class LadderTextView extends android.support.v7.widget.AppCompatTextView { private static final String TAG = 'LadderView'; private Path linePath; private Paint paint, textPaint; private int width, height; private float strokeWidth = 2; private Region mRegion; private String textContent; private int lineOffset = 0;//劃線的偏移量 private int textOffset = 0;//文本的偏移量 private float offsetScale = 1;//梯高與(梯頂與梯底)之差的比例(梯底比梯頂長) private boolean isLeft = true;//分為左和右兩種斜角梯形模式 private boolean isSelected = false;//是否是選定 private int selectedColor = Color.BLACK; public LadderTextView(Context context) {super(context);init(); } public LadderTextView(Context context, AttributeSet attrs) {super(context, attrs);initAttributes(context, attrs);init(); } public LadderTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initAttributes(context, attrs);init(); } private void initAttributes(Context context, AttributeSet attrs) {TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.LadderTextView);textContent = typedArray.getString(R.styleable.LadderTextView_textContent);offsetScale = typedArray.getFloat(R.styleable.LadderTextView_offsetScale, 0.5f);isLeft = typedArray.getBoolean(R.styleable.LadderTextView_isLeft, true);isSelected = typedArray.getBoolean(R.styleable.LadderTextView_isSelected, true);selectedColor = typedArray.getColor(R.styleable.LadderTextView_selectedColor, Color.GREEN);strokeWidth = typedArray.getDimension(R.styleable.LadderTextView_strokeWidth, 1);typedArray.recycle(); } private void init() {Log.v(TAG, 'init');mRegion = new Region();paint = new Paint();textPaint = new Paint();linePath = new Path();paint.setAntiAlias(true);paint.setStrokeWidth(dp2px(getContext(), strokeWidth));paint.setColor(selectedColor);paint.setStyle(isSelected ? Paint.Style.FILL_AND_STROKE : Paint.Style.STROKE);paint.setStrokeJoin(Paint.Join.ROUND);textPaint.setAntiAlias(true);textPaint.setTextSize(getTextSize());//傳遞TextSize(px)textPaint.setColor(isSelected ? Color.WHITE : selectedColor);setText('');//去除掉原有的Text內容lineOffset = dp2px(getContext(), strokeWidth) / 2;textOffset = (int) (getTextSize() / 2) + getBaseline() * 2;Log.v(TAG, 'lineOffset textOffset ->' + lineOffset + ' ' + textOffset); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);width = getWidth();height = getHeight();Log.v(TAG, 'width height->' + width + ' ' + height); } @Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);Log.v(TAG, 'onDraw');if (isLeft) { linePath.moveTo(0 + lineOffset, 0 + lineOffset); linePath.lineTo(width, 0 + lineOffset); linePath.lineTo((int) (width - offsetScale * height), height - lineOffset); linePath.lineTo(0 + lineOffset, height - lineOffset); linePath.close(); setTextAlignment(TEXT_ALIGNMENT_TEXT_START); canvas.drawPath(linePath, paint); canvas.drawText(textContent == null ? '' : textContent, getPaddingStart() + lineOffset, height / 2 + textOffset, textPaint);} else { linePath.moveTo(0 + lineOffset + offsetScale * height, 0 + lineOffset); linePath.lineTo(width - lineOffset, 0 + lineOffset); linePath.lineTo(width - lineOffset, height - lineOffset); linePath.lineTo(0, height - lineOffset); linePath.close(); setTextAlignment(TEXT_ALIGNMENT_TEXT_END); canvas.drawPath(linePath, paint); canvas.drawText(textContent == null ? '' : textContent, getWidth() - lineOffset - getPaddingEnd() - getDrawTextWidth(textPaint, textContent), height / 2 + textOffset, textPaint);} } @Override public boolean dispatchTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN) { if (!isInRegion(event)) {//點擊的點的位置不在范圍內則不響應return false; }}return super.dispatchTouchEvent(event); } /** * 判斷點擊的位置是否在要求的范圍內 * @param event * @return */ public boolean isInRegion(MotionEvent event) {RectF rectF = new RectF();linePath.computeBounds(rectF, true);mRegion.setPath(linePath, new Region((int) rectF.left, (int) rectF.top, (int) rectF.right, (int) rectF.bottom));return mRegion.contains((int) event.getX(), (int) event.getY()); } /** * 獲取要畫的字符串的寬度 * * @param paint * @param textContent * @return */ private int getDrawTextWidth(Paint paint, String textContent) {float totalWidth = 0f;if (textContent != null && textContent.length() > 0) { int len = textContent.length(); float[] widths = new float[len]; paint.getTextWidths(textContent, widths); for (int j = 0; j < len; j++) {totalWidth += widths[j]; }}return (int) Math.ceil(totalWidth); } /** * @param dpValue (DisplayMetrics類中屬性density) * @return */ private int dp2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f); } public void setTextContent(String textContent) {this.textContent = textContent;invalidate(); } public void setMSelected(boolean isSelected) {textPaint.setColor(isSelected ? Color.WHITE : selectedColor);paint.setStyle(isSelected ? Paint.Style.FILL_AND_STROKE : Paint.Style.STROKE);this.isSelected = isSelected;invalidate(); } @Override public boolean isSelected() {return isSelected; }}要點分析1.背景與文本內容的繪制

計算好四個點的位置連線,TextView默認的文本內容則設置為空字符串,采用drawText的方式來實現文本的顯示。需要注意的是計算文本的字號長度大小、顏色以及位于整個view的位置、偏移量等。

2.梯形范圍內外的點擊事件處理

依照于設計,梯形內的點擊才有響應,則要計算點擊的位置是否在梯形內,然后通過dispatchTouchEvent來做事件的分發。

/** * 判斷點擊的位置是否在要求的范圍內 * @param event * @return */ public boolean isInRegion(MotionEvent event) {RectF rectF = new RectF();linePath.computeBounds(rectF, true);mRegion.setPath(linePath, new Region((int) rectF.left, (int) rectF.top, (int) rectF.right, (int) rectF.bottom));return mRegion.contains((int) event.getX(), (int) event.getY()); }3.其它自定義屬性

依據于需求來定,注意invalidate。

最后,完整代碼

https://github.com/ganshenml/LadderTextView

以上就是Android實現梯形TextView效果的詳細內容,更多關于Android 梯形TextView的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆精品国产91久久久久久| 久久精品一区二区国产| 国产一区二区三区免费在线| 美女视频免费精品| 免费亚洲婷婷| 麻豆久久一区| 精品视频网站| 老牛影视精品| 久久久久国产精品一区二区| 日韩不卡在线| 欧美日韩一区二区综合 | 国产在线成人| 欧美亚洲国产激情| 亚洲成av人片一区二区密柚| 99视频精品全国免费| 91精品久久久久久久久久不卡| 91精品国产成人观看| 91九色精品国产一区二区| 在线观看免费一区二区| 免费在线观看成人| 欧美在线首页| 精品国产三区在线| 欧美freesex黑人又粗又大| 亚洲91精品| 日本欧美在线看| 日韩欧美激情| 久久精品国产福利| 天堂а√在线最新版中文在线| 久久九九精品| 噜噜噜躁狠狠躁狠狠精品视频 | 久久激情五月婷婷| 高潮久久久久久久久久久久久久| 欧洲亚洲一区二区三区| 欧美一级精品| а√在线中文在线新版| 亚洲综合福利| 日韩一区二区三区免费视频| 精品日韩一区| 亚洲欧美在线综合| 九九久久国产| 国产精品一区二区精品| 国产精品啊v在线| 亚洲综合小说| 精品久久精品| 综合一区av| 国产a亚洲精品| 精品一区免费| 视频一区免费在线观看| 免费视频一区二区三区在线观看| 在线一区免费观看| 另类欧美日韩国产在线| 免费欧美一区| 国产传媒在线| 国产精品夜夜夜| 日韩伦理福利| 99久久夜色精品国产亚洲1000部| 亚洲三级精品| 在线综合视频| 午夜性色一区二区三区免费视频| 中文在线不卡| 在线综合视频| 免费精品一区| 亚洲一区成人| 国产综合色区在线观看| 亚洲毛片在线免费| 亚洲精品一级| 亚洲理论在线| 日韩一区亚洲二区| 久久国产电影| 99riav国产精品| 日韩一区二区在线免费| 色88888久久久久久影院| 日本欧美大码aⅴ在线播放| 亚洲欧美日韩一区在线观看| 91亚洲国产高清| 国产精品视频一区视频二区| 999久久久精品国产| 成人在线超碰| 毛片不卡一区二区| 欧美日韩精品一区二区三区视频 | 99视频精品免费观看| 国产精品www.| 中文字幕日本一区二区| 久久国产成人午夜av影院宅| 国产丝袜一区| 成人欧美一区二区三区的电影| 激情五月色综合国产精品| 日韩在线卡一卡二| 岛国av在线网站| 国产一区二区三区四区五区| 色一区二区三区| 国户精品久久久久久久久久久不卡| 国产精品亚洲欧美日韩一区在线| 欧美一区久久久| 99视频一区| 精品在线网站观看| 日韩专区一卡二卡| 亚洲精品午夜av福利久久蜜桃| 久久久久黄色| 国产精品亚洲四区在线观看 | 美女少妇全过程你懂的久久| 国产欧美自拍一区| 亚洲啊v在线免费视频| 国产美女高潮在线| 91九色精品国产一区二区| 国产精品成人一区二区不卡| 麻豆理论在线观看| 免费成人av在线播放| 蜜桃tv一区二区三区| 亚洲精选成人| yellow在线观看网址| 欧美成人高清| 久久99高清| 亚洲调教视频在线观看| 日韩综合在线| 日韩精品久久久久久久软件91| 亚洲在线一区| 精品国产一区二区三区2021| 亚洲一二三区视频| 视频在线观看一区二区三区| 毛片不卡一区二区| 亚洲一区二区三区无吗| 国产免费成人| 国产高清久久| 一区在线免费观看| 精品久久影院| 女生影院久久| 你懂的亚洲视频| 亚洲欧美一区在线| 国产精品久久久久久妇女| 奇米色欧美一区二区三区| 日韩成人精品一区| 欧美亚洲一级| 国产va免费精品观看精品视频| 鲁鲁在线中文| 亚洲最新av| 在线一区av| 日韩精品免费一区二区夜夜嗨| 亚洲开心激情| 国产一精品一av一免费爽爽| 成人精品天堂一区二区三区| 欧美亚洲二区| 欧美日韩免费观看视频| 日韩视频1区| 青青伊人久久| 亚洲色图综合| 国产亚洲网站| 亚洲精品网址| 欧美日韩亚洲一区三区| 精品国产精品国产偷麻豆| 日韩一区三区| 久久精品国产www456c0m| 中文国产一区| 日本不卡视频在线观看| 国产精品资源| se01亚洲视频 | 国产在线欧美| 久久一区二区三区喷水| 综合亚洲色图| 精品亚洲免a| 999在线观看精品免费不卡网站| 午夜国产精品视频| 亚洲网址在线观看| 国产精品久久久久久久免费软件| 一区三区视频| 日韩午夜免费| 国产日韩欧美三级| 视频一区中文字幕国产| 狠狠操综合网| 国产精品4hu.www| 欧美一区三区| 在线看片福利| 亚洲一区二区免费看| 亚洲精品女人| 国产精品99久久免费| 久久精品官网| 蜜桃成人av| 精品亚洲自拍| 一区二区三区国产在线| 亚洲精品麻豆| 久久久精品五月天| 麻豆精品蜜桃视频网站| 丝袜亚洲精品中文字幕一区| 日本久久综合| 亚洲免费福利一区| 精品中文在线| 日韩综合在线| 国产高清精品二区| 精品一区电影| 亚洲专区视频| 欧美日韩va| 99久久久久国产精品| 亚洲激情偷拍| 先锋亚洲精品| 免费日韩一区二区| 你懂的国产精品永久在线| 99在线|亚洲一区二区| 人在线成免费视频| 免费日韩一区二区| 亚洲精品中文字幕乱码|