电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Android實現梯形TextView效果

瀏覽:143日期: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
相關文章:
主站蜘蛛池模板: 合金耐磨锤头_破碎机锤头_郑州市德勤建材有限公司 | 碎石机设备-欧版反击破-欧版颚式破碎机(站)厂家_山东奥凯诺机械 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | NBA直播_NBA直播免费观看直播在线_NBA直播免费高清无插件在线观看-24直播网 | 懂研帝_专业SCI论文润色机构_SCI投稿发表服务公司 | 【电子厂招聘_普工招工网_工厂招聘信息平台】-工立方打工网 | 电磁流量计_智能防腐防爆管道式计量表-金湖凯铭仪表有限公司 | 彩超机-黑白B超机-便携兽用B超机-多普勒彩超机价格「大为彩超」厂家 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 便携式谷丙转氨酶检测仪|华图生物科技百科| 玉米深加工设备|玉米加工机械|玉米加工设备|玉米深加工机械-河南成立粮油机械有限公司 | 高压绝缘垫-红色配电房绝缘垫-绿色高压绝缘地毯-上海苏海电气 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 液压油缸-液压缸厂家价格,液压站系统-山东国立液压制造有限公司 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | RO反渗透设备_厂家_价格_河南郑州江宇环保科技有限公司 | 博客-悦享汽车品质生活 | 首页 - 军军小站|张军博客| 沥青车辙成型机-车托式混凝土取芯机-混凝土塑料试模|鑫高仪器 | 电镀标牌_电铸标牌_金属标贴_不锈钢标牌厂家_深圳市宝利丰精密科技有限公司 | 双效节能浓缩器-热回流提取浓缩机组-温州市利宏机械 | 哲力实业_专注汽车涂料汽车漆研发生产_汽车漆|修补油漆品牌厂家 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 上海道勤塑化有限公司| 保温杯,儿童婴童奶瓶,运动水壶「广告礼品杯定制厂家」超朗保温杯壶 | 净水器代理,净水器招商,净水器加盟-FineSky德国法兹全屋净水 | 鑫达滑石-辽宁鑫达滑石集团 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 涿州网站建设_网站设计_网站制作_做网站_固安良言多米网络公司 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 短信通106短信接口验证码接口群发平台_国际短信接口验证码接口群发平台-速度网络有限公司 | 真空吸污车_高压清洗车厂家-程力专用汽车股份有限公司官网 | 非小号行情 - 专业的区块链、数字藏品行情APP、金色财经官网 | 液压压力机,液压折弯机,液压剪板机,模锻液压机-鲁南新力机床有限公司 | 雄松华章(广州华章MBA)官网-专注MBA/MPA/MPAcc/MEM辅导培训 | 石英砂矿石色选机_履带辣椒色选机_X光异物检测机-合肥幼狮光电科技 | 示波器高压差分探头-国产电流探头厂家-南京桑润斯电子科技有限公司 | 北京网站建设-企业网站建设-建站公司-做网站-北京良言多米网络公司 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 桁架楼承板-钢筋桁架楼承板-江苏众力达钢筋楼承板厂 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 |