问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

自定义TextView可控制Drawable大小

发布网友 发布时间:2024-09-28 18:25

我来回答

1个回答

热心网友 时间:2024-10-20 05:33

一般来说,我们在实际开发场景中都会碰到这种情况

一般来说我们会如下进行布局

但是要知道,ViewGroup也就是我们根布局,会对子View进行测量,每多一个View就会导致多测量一个View,而且我们设置点击也不好进行操作.当然如果你说再包一层那我确实没话说

所以我们需要一个更简洁更方便的方法来解决这种让人抓狂的问题

恰巧TextView就为我们提供了一个方式.

我们可以通过DrawableTop,DrawableBottom.DrawableLeft,DrawableRight为Textview的Drawable设置位置.但是新的问题出现了,Drawable的大小我们无法在Xml里进行控制,在不同的手机上他展示的效果很可能会不一致,甚至导致你的布局出现错乱.

当然你可以通过以下方式设置

如果你是独立开发,无所谓,如果是协同开发,你这么写会死人的。

这个时候就需要我们对TextView进行自定义了.

/***可自定义Drawable的TextView*strokeWidth可设置字体粗细中粗建议0.3f默认不加粗*/publicclassDrawableTextViewextendsandroidx.appcompat.widget.AppCompatTextView{privatefinalintDRAWABLE_LEFT=0;privatefinalintDRAWABLE_TOP=1;privatefinalintDRAWABLE_RIGHT=2;privatefinalintDRAWABLE_BOTTOM=3;privatefinalintleftDrawableWidth;privatefinalintleftDrawableHeight;privatefinalintrightDrawableWidth;privatefinalintrightDrawableHeight;privatefinalinttopDrawableWidth;privatefinalinttopDrawableHeight;privatefinalintbottomDrawableWidth;privatefinalintbottomDrawableHeight;privatefinalfloatstrokeWidth;privateintleftWidth,rightWidth;//左右图片宽度privateDrawableListener.DrawableRightListenerdrawableRightListener;privateDrawableListener.DrawableLeftListenerdrawableLeftListener;privateDrawableListener.DrawableTopListenerdrawableTopListener;privateDrawableListener.DrawableBottomListenerdrawableBottomListener;privateContextcontext;publicDrawableTextView(Contextcontext){this(context,null);init(context);}publicDrawableTextView(Contextcontext,AttributeSetattrs){this(context,attrs,0);init(context);}publicDrawableTextView(Contextcontext,AttributeSetattrs,intdefStyleAttr){super(context,attrs,defStyleAttr);TypedArraytypedArray=context.obtainStyledAttributes(attrs,R.styleable.DrawableTextView,defStyleAttr,0);leftDrawableHeight=typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_leftDrawableHeight,(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,-1,getResources().getDisplayMetrics()));leftDrawableWidth=typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_leftDrawableWidth,(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,-1,getResources().getDisplayMetrics()));rightDrawableHeight=typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_rightDrawableHeight,(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,-1,getResources().getDisplayMetrics()));rightDrawableWidth=typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_rightDrawableWidth,(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,-1,getResources().getDisplayMetrics()));topDrawableHeight=typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_topDrawableHeight,(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,-1,getResources().getDisplayMetrics()));topDrawableWidth=typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_topDrawableWidth,(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,-1,getResources().getDisplayMetrics()));bottomDrawableHeight=typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_bottomDrawableHeight,(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,-1,getResources().getDisplayMetrics()));bottomDrawableWidth=typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_bottomDrawableWidth,(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,-1,getResources().getDisplayMetrics()));strokeWidth=typedArray.getFloat(R.styleable.DrawableTextView_StrokeWidth,0);typedArray.recycle();init(context);}privatevoidinit(Contextcontext){//自定义加粗程度建议0.3fif(strokeWidth!=0){TextPaintpaint=getPaint();paint.setStrokeWidth(strokeWidth);paint.setStyle(Paint.Style.FILL_AND_STROKE);}drawable();}privatevoiddrawable(){Drawable[]drawables=getCompoundDrawables();for(inti=0;i<drawables.length;i++){setDrawableSize(drawables[i],i);}//放置图片setCompoundDrawables(drawables[DRAWABLE_LEFT],drawables[DRAWABLE_TOP],drawables[DRAWABLE_RIGHT],drawables[DRAWABLE_BOTTOM]);}//设置drawableRight图片的点击监听publicvoidsetDrawableRightListener(DrawableListener.DrawableRightListenerdrawableRightListener){this.drawableRightListener=drawableRightListener;}publicvoidsetDrawableLeftListener(DrawableListener.DrawableLeftListenerdrawableLeftListener){this.drawableLeftListener=drawableLeftListener;}publicvoidsetDrawableTopListener(DrawableListener.DrawableTopListenerdrawableTopListener){this.drawableTopListener=drawableTopListener;}publicvoidsetDrawableBottomListener(DrawableListener.DrawableBottomListenerdrawableBottomListener){this.drawableBottomListener=drawableBottomListener;}@OverridepublicbooleanonTouchEvent(MotionEventevent){switch(event.getAction()){caseMotionEvent.ACTION_UP:if(drawableRightListener!=null){DrawabledrawableRight=getCompoundDrawables()[DRAWABLE_RIGHT];if(drawableRight!=null&&event.getRawX()>=(getRight()-drawableRight.getBounds().width())&&event.getRawX()<getRight()){drawableRightListener.drawableRightListener(this);returntrue;}}if(drawableLeftListener!=null){DrawabledrawableLeft=getCompoundDrawables()[DRAWABLE_LEFT];if(drawableLeft!=null&&event.getRawX()<=(getLeft()+drawableLeft.getBounds().width())&&event.getRawX()>getLeft()){drawableLeftListener.drawableLeftListener(this);returntrue;}}if(drawableTopListener!=null){DrawabledrawableTop=getCompoundDrawables()[DRAWABLE_TOP];if(drawableTop!=null&&event.getRawY()<=(getTop()+drawableTop.getBounds().height())&&event.getRawY()>getTop()){drawableTopListener.drawableTopListener(this);returntrue;}}if(drawableBottomListener!=null){DrawabledrawableBottom=getCompoundDrawables()[DRAWABLE_BOTTOM];if(drawableBottom!=null&&event.getRawY()>=(getBottom()-drawableBottom.getBounds().height())&&event.getRawY()<getBottom()){drawableBottomListener.drawableBottomListener(this);returntrue;}}break;}returnsuper.onTouchEvent(event);}@OverrideprotectedvoidonDraw(Canvascanvas){super.onDraw(canvas);}//设置图片的高度和宽度privatevoidsetDrawableSize(Drawabledrawable,intindex){if(drawable==null){return;}//左上右下intwidth=0,height=0;switch(index){caseDRAWABLE_LEFT:width=leftDrawableWidth;height=leftDrawableHeight;break;caseDRAWABLE_TOP:width=topDrawableWidth;height=topDrawableWidth;break;caseDRAWABLE_RIGHT:width=rightDrawableWidth;height=rightDrawableWidth;break;caseDRAWABLE_BOTTOM:width=bottomDrawableWidth;height=bottomDrawableHeight;break;}//如果没有设置图片的高度和宽度具使用默认的图片高度和宽度if(width<0){width=drawable.getIntrinsicWidth();}if(height<0){height=drawable.getIntrinsicHeight();}if(index==0){leftWidth=width;}elseif(index==2){rightWidth=width;}drawable.setBounds(0,0,width,height);}}

必要的注释,我已经写在代码里了.里面其实我做了一些自己的常用的封装..

对于Drawable的点击监听,因为有时候实际的业务场景很复杂,阴间的产品需求可能会让你只能对Drawable点击触发事件

设置字体的粗细程度,Textview我们虽然可以设置是否粗细,但是官方提供的API设置的太粗了,你仔细看蓝湖上的字体粗细,有很大差别.

以下是使用方式

上面可以看到我的StrokeWidth是3,这个我给予的是float,你按照自己的感觉设置即可.

监听要设置你Drawable位置的监听,如果你的xml是DrawableLeft,在Activity里你设置的DrawableTop点击事件他是不会生效的.

为了方便大家复制下面是attrs里的配置

<!--drawableTextView--><declare-styleablename="DrawableTextView"><attrname="leftDrawableWidth"format="dimension"/><attrname="leftDrawableHeight"format="dimension"/><attrname="rightDrawableWidth"format="dimension"/><attrname="rightDrawableHeight"format="dimension"/><attrname="topDrawableWidth"format="dimension"/><attrname="topDrawableHeight"format="dimension"/><attrname="bottomDrawableWidth"format="dimension"/><attrname="bottomDrawableHeight"format="dimension"/><attrname="StrokeWidth"format="float"/></declare-styleable>

其实上面的封装没有什么高深的东西,都是一些基础,不过一些涉及的东西比较乱而已,大家不用太注意细节,只要能解决项目中的实际问题即可。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
司法矫正期间 手机业务社区司法矫正标准包 不小心退定了会有什么后果... x面容可以修吗 急!!!我在望京想办张北京农商银行卡,不知道银行在哪,有知道的吗?怎么走... 什么是干式油底壳润滑系统? 建设银行的龙卡全球至尊信用卡额度一般是多少呀? 万和燃气热水器传感器用多久 红警3升级补丁 红警3下的补丁覆盖到安装目录了,除了换了张图.怎么还是老样子_百度知 ... 问一下,红警3,原版,从1.00到1.12所有的平衡性修改~ 谢谢 i9300开机显示此LockScreen未授权是什么情况 ios9.21是不是不能越狱了 苹果9.21可以越狱吗? 苹果手机9.21系统能不能越狱 苹果6.8.41和9.21那个快 我是个较瘦的男性,腰臀比竟为0.793,是否正常? 开袋即食的活珠子是煮熟的可以直接吃吗 《充实的暑假》四年级作文600字7篇 沐浴盐和沐浴露的区别 沐浴盐和沐浴露的正确使用方法 沐浴盐的正确使用方法 沐浴盐的正确使用方法是什么 沐浴盐如何使用 袭警和妨碍公务哪个罪大? 妨碍公务袭警罪判多久的刑期 袭警罪与妨碍公务罪哪个更重 妨碍执行公务罪和袭警罪判多长时间? 汉中市天坑群地质遗迹保护利用中心工资待遇 在陕西省汉中市工资多少钱一个月 IP1000连供打印机用几个月了,今天黑色一点也不喷了 Canon PIXMA iP1000问题,急! 佳能IP1000纸张被卡。 本人需要一个matlab程序,条件:其中有while、for循环和if分支结构,还需... 快递飞机盒定做 佳生-⑤护眼灯用的灯管是多少瓦? 我的一台佳生护眼灯不亮了,我想进行维修,但是不知道器件的型号。具体的... 请教下大家护眼灯 佳生、飞利浦、明可达 哪个牌子好啊~ 为什么呢 3Q... 固话接不进来,来点听的见铃声,拿起来听不到里面对方说话是怎么回事_百 ... 固话 对方听不到声音怎么修理?拜托各位了 3Q 世界十大名牌包包 世界名牌包包有哪些品牌 世界名包有哪些 2021高速免费时间是几号 2021高速免费时间是什么时候 2021年高速公路什么时候开始不收费 2021年高速免费通行时间有哪些 2021年高速什么时候免费通行 如何确认qq好友删除自己了? 图片中的这两个女生的发型是什么发型??披肩发吗?做这种发型的头像发质... 平安人寿保险怎么样可靠吗 长期使用直板夹夹直头发对头发有没有坏处啊. 1688诚意赊如何关闭? 梦见古钱5元 ...梦见我捡到4张一元钱的人民币,还给了人家5元钱,最后还梦到被老虎追... 梦见金属5元钱是啥意思呢?