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

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

Android實現梯形TextView效果

瀏覽:100日期: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久久,三上悠亚国产精品一区二区三区
激情欧美亚洲| 国产剧情在线观看一区| 国产精品一区2区3区| 国产精品天堂蜜av在线播放| 久久久免费人体| 精品亚洲成人| 久久男女视频| 亚洲大全视频| 妖精视频成人观看www| 水蜜桃久久夜色精品一区的特点| 综合一区二区三区| 国产精成人品2018| 蜜臀国产一区| 日韩视频在线一区二区三区 | 国产香蕉精品| 国产精品啊v在线| 福利视频一区| 亚洲v在线看| 亚洲毛片在线免费| 精品中国亚洲| 午夜电影亚洲| 国产精品久久久久9999高清| 久久精品国产亚洲夜色av网站| 免费成人在线影院| 91精品啪在线观看国产18| 999国产精品999久久久久久| 亚洲精品综合| 亚洲精品三级| 精品国产18久久久久久二百| 国产美女精品| 国产亚洲电影| 欧美国产美女| 欧美日韩国产综合网| 欧美精品观看| 黄页网站一区| 麻豆国产精品777777在线| 99视频精品免费观看| 久久影视三级福利片| 国产精品社区| 欧美xxxx中国| 青青草伊人久久| 日韩美女精品| jiujiure精品视频播放| 久久精品网址| 日韩一区二区三区四区五区| 日韩一区自拍| 国产毛片久久久| 国产精品日本| 久久久精品网| 国产精品一线天粉嫩av| 麻豆精品91| 日韩一区二区在线免费| 国产高清精品二区| 免费久久99精品国产| 久久久久国产精品一区二区| 国产精成人品2018| 日韩精品中文字幕吗一区二区| 久久国产电影| 国产一区二区色噜噜| 日韩欧美中文字幕在线视频| 99久久婷婷| 精品少妇一区| 日韩精品一页| 男人天堂欧美日韩| 日韩欧美一区二区三区免费观看| 国产精品嫩模av在线| 综合激情视频| 午夜久久黄色| 欧美日韩在线网站| 亚洲精品.com| 97精品97| 精品无人区麻豆乱码久久久| 欧美精品观看| 亚洲tv在线| 一区二区91| 日韩网站在线| 亚洲国产专区校园欧美| 精品视频在线一区二区在线| 国产精品久av福利在线观看| 久久精品72免费观看| 日韩一区免费| 亚洲精品在线二区| 亚洲色图网站| 一区二区三区四区日韩| 亚洲欧美成人综合| 老色鬼久久亚洲一区二区| 不卡一区综合视频| 黄色成人精品网站| 夜久久久久久| 一区二区精品| 亚洲欧美专区| 日本中文字幕不卡| 日韩二区在线观看| 日韩超碰人人爽人人做人人添| 亚洲免费专区| 国产精品网址| 精品三级久久久| 日韩欧美网址| 怡红院精品视频在线观看极品| 欧美日韩视频| 亚洲精品亚洲人成在线观看| 青青伊人久久| 九九99久久精品在免费线bt| 日韩电影免费网站| 蜜桃视频欧美| 一区二区91| 日韩欧美久久| 国产区精品区| 激情国产在线| 欧美特黄一级| 日韩av一二三| 色欧美自拍视频| 国产精品亚洲综合久久| 午夜一区在线| 青青青国产精品| 国产一区二区三区四区二区| 久久青草久久| 亚洲三级精品| 国产黄色一区| 久久精品成人| 中文字幕亚洲精品乱码| 中文字幕日本一区二区| 国产精品久久久久久久久久白浆| 97精品国产福利一区二区三区| 欧美日韩国产免费观看视频| 婷婷综合一区| 91一区二区三区四区| 日韩一区精品视频| 国产精品成人一区二区网站软件| 国产高清不卡| 丝袜a∨在线一区二区三区不卡| 国产精品色婷婷在线观看| 久久久国产亚洲精品| 日韩三级精品| 日本а中文在线天堂| 视频一区欧美精品| 国产探花在线精品| 久久一级电影| 日本成人在线视频网站| 丝袜诱惑一区二区| 香蕉视频成人在线观看| 精品视频网站| 石原莉奈在线亚洲三区| 老牛国内精品亚洲成av人片| 欧美~级网站不卡| 国产精品亚洲二区| av不卡在线| 成人欧美一区二区三区的电影| 综合激情婷婷| 亚洲网站视频| 久久精品一区二区国产| 91九色精品| 久久免费影院| 亚洲最大av| 久久亚洲成人| 精品中文字幕一区二区三区四区| 丝袜美腿亚洲一区| 日韩免费在线| 国产极品嫩模在线观看91精品| 中文精品视频| 成人在线免费观看91| 一区二区日韩免费看| 99视频精品视频高清免费| 国产精品蜜月aⅴ在线| 免费精品视频在线| 国产综合视频| 精品美女在线视频| 亚洲精品少妇| 一级欧洲+日本+国产| 欧美韩日一区| 国产精品白丝一区二区三区| 亚洲精品第一| 国产精品美女| 蜜臀久久99精品久久一区二区 | 中文亚洲欧美| 日韩在线免费| 精品久久免费| 国产精品毛片aⅴ一区二区三区| 中文日韩欧美| 久久中文字幕二区| 精品欧美日韩精品| 国产日韩欧美高清免费| 亚洲麻豆一区| 丝袜美腿亚洲色图| 国产一区观看| 精品日韩视频| 久久uomeier| 精品久久久久久久| 久久99性xxx老妇胖精品| 91亚洲无吗| 日韩不卡一区二区| 欧美亚洲一区二区三区| 日韩高清不卡一区| 日本一区二区中文字幕| 久热综合在线亚洲精品| 亚洲综合另类| 日本大胆欧美人术艺术动态| 久久精品国语| 国内精品福利| 日韩一级不卡|