欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android编程中TextView宽度过大导致Drawable无法居中问题解决方法

程序员文章站 2023-11-23 21:21:40
本文实例讲述了android编程中textview宽度过大导致drawable无法居中问题解决方法。分享给大家供大家参考,具体如下: 在做项目的时候,很多时候我们都要用到...

本文实例讲述了android编程中textview宽度过大导致drawable无法居中问题解决方法。分享给大家供大家参考,具体如下:

在做项目的时候,很多时候我们都要用到文字和图片一起显示,一般设置textview的drawableleft、drawableright、drawabletop、drawablebottom就行了。但是有一种情况是当textview的熟悉是fill_parent或者使用权重的时候并且设置了起gravity的ceter的时候,drawable图片是无法一起居中的,为了解决其,我们一般再套一层布局,然后设置textview的熟悉是wrap_content,但是有时候嵌套过多的布局的时候,有可能发生*,所以必须要优化,下面说一下其中的一个解决方案。先上图

Android编程中TextView宽度过大导致Drawable无法居中问题解决方法

这个解决方案很粗糙,局限性很大,文字不能换行,换行之后就不准了,下面是源码:

package com.example.testandroid; 
import java.lang.ref.weakreference; 
import android.content.context; 
import android.graphics.bitmap; 
import android.graphics.bitmapfactory; 
import android.graphics.canvas; 
import android.graphics.color; 
import android.graphics.rect; 
import android.util.attributeset; 
import android.view.motionevent; 
import android.widget.textview; 
public class drawabletextview extends textview { 
 private weakreference<bitmap> normalreference; 
 private weakreference<bitmap> pressreference; 
 private weakreference<bitmap> showreference; 
 private int normalcolor = color.white, presscolor = color.white; 
 private string text; 
 private int textwidth = 0; 
 private int textheight = 0; 
 public drawabletextview(context context) { 
  super(context); 
 } 
 public drawabletextview(context context, attributeset attrs) { 
  super(context, attrs); 
 } 
 public drawabletextview(context context, attributeset attrs, int defstyle) { 
  super(context, attrs, defstyle); 
 } 
 @override 
 protected void onfinishinflate() { 
  super.onfinishinflate(); 
  inittext(); 
 } 
 private void inittext() { 
  text = super.gettext().tostring(); 
  initvariable(); 
 } 
 /** 
  * 初始化,测量textview内容的长度,高度 
  */ 
 private void initvariable() { 
  textwidth = (int) (getpaint().measuretext(text)); 
  final rect rect = new rect(); 
  getpaint().gettextbounds(text, 0, 1, rect); 
  textheight = rect.height(); 
 } 
 /** 
  * 设置textview的内容 
  * @param text 
  */ 
 public void settext(string text) { 
  this.text = text; 
  initvariable(); 
  invalidate(); 
 } 
 /** 
  * 获取textview内容 
  */ 
 public string gettext() { 
  return text; 
 } 
 /** 
  * 设置textview的drawable内容,目前仅支持drawableleft 
  * @param normaldrawableid 
  *    drawableleft的normal状态id 
  * @param pressdrawableid 
  *    drawableleft的press状态的id(没有press状态,请传-1) 
  */ 
 public void setdrawableleftid(final int normaldrawableid, final int pressdrawableid) { 
  normalreference = new weakreference<bitmap>(bitmapfactory.decoderesource(getresources(), normaldrawableid)); 
  if (pressdrawableid != -1) { 
   pressreference = new weakreference<bitmap>(bitmapfactory.decoderesource(getresources(), pressdrawableid)); 
  } 
  showreference = normalreference; 
  invalidate(); 
 } 
 /** 
  * 设置textview的color 
  * @param normalcolor 
  *    textview normal状态的color值 
  * @param pressdrawableid 
  *    textview press状态的color值(如果没有press状态,请传与normal状态的值) 
  */ 
 public void settextcolor(final int normalcolor, final int presscolor) { 
  this.normalcolor = normalcolor; 
  this.presscolor = presscolor; 
  getpaint().setcolor(normalcolor); 
  initvariable(); 
 } 
 @override 
 protected void ondraw(canvas canvas) { 
  if (showreference != null && showreference.get() != null) { 
   final int bitmapwidth = showreference.get().getwidth(); 
   final int bitmapheight = showreference.get().getheight(); 
   final int viewheight = getheight(); 
   final int drawablepadding = getcompounddrawablepadding(); 
   final int start = (getwidth() - (bitmapwidth + drawablepadding + textwidth)) >> 1; 
   canvas.drawbitmap(showreference.get(), start, (viewheight >> 1) - (bitmapheight >> 1), getpaint()); 
   /** 
    * 注意改方法,第三个参数y,本人也被误导了好久,原来在画文字的时候,y表示文字最后的位置(不是下笔点的起始位置) 
    * 所以为什么 是textview高度的一半(中间位置) + 文字高度的一半 = 文字居中 
    */ 
   canvas.drawtext(text, start + drawablepadding + bitmapwidth, (viewheight >> 1) + (textheight >> 1), getpaint()); 
  } 
 } 
 @override 
 public boolean ontouchevent(motionevent event) { 
  if (event.getaction() == motionevent.action_down) { 
   if (pressreference != null && pressreference.get() != null) { 
    showreference = pressreference; 
   } 
   getpaint().setcolor(presscolor); 
  } else if (event.getaction() == motionevent.action_up) { 
   if (normalreference != null && normalreference.get() != null) { 
    showreference = normalreference; 
   } 
   getpaint().setcolor(normalcolor); 
  } 
  invalidate(); 
  return super.ontouchevent(event); 
 } 
}

xml布局:

<com.example.testandroid.drawabletextview 
android:id="@+id/my_textview" 
android:layout_width="fill_parent" 
android:layout_margintop="20dp" 
android:background="@drawable/text_selector" 
android:drawablepadding="8dp" 
android:textcolor="@color/standard_orange" 
android:layout_height="wrap_content" 
android:padding="15dp" 
android:textsize="16sp" 
android:text="有drawable的textview" />

调用代码:

drawabletextview drawabletextview = (drawabletextview) getview().findviewbyid(r.id.my_textview);
drawabletextview.setdrawableleftid(r.drawable.bg_btn_delete_normal, r.drawable.bg_btn_delete_pressed);
drawabletextview.settextcolor(getresources().getcolor(r.color.standard_orange), getresources().getcolor(r.color.standard_white));
drawabletextview.settext("我在动态修改text啦");

其实还有更加方便的方法,下面朋友借鉴某个网友的代码(地址我就不知道了):

@override 
protected void ondraw(canvas canvas) { 
 drawable[] drawables = getcompounddrawables(); 
 if (drawables != null) { 
  drawable drawableleft = drawables[0]; 
  if (drawableleft != null) { 
   final float textwidth = getpaint().measuretext(gettext().tostring()); 
   final int drawablepadding = getcompounddrawablepadding(); 
   final int drawablewidth = drawableleft.getintrinsicwidth(); 
   final float bodywidth = textwidth + drawablewidth + drawablepadding; 
   canvas.translate((getwidth() - bodywidth) / 2, 0); 
  } 
 } 
 super.ondraw(canvas); 
}

xml布局:

<com.example.testandroid.drawabletextview 
android:id="@+id/my_textview" 
android:layout_width="fill_parent" 
android:layout_margintop="20dp" 
android:background="@drawable/text_selector" 
android:drawablepadding="8dp" 
android:drawableleft="@drawable/clear_edittext_selector" 
android:textcolor="@color/text_color_selector" 
android:layout_height="wrap_content" 
android:padding="15dp" 
android:textsize="16sp" 
android:text="有drawable的textview" />

嗯,自己写这个东西,也学到了一些东西,大家有什么更好的方法,大家可以讨论一下。

希望本文所述对大家android程序设计有所帮助。