Android textView drawableXX圖片大小
TextView自帶的drawableLeft屬性竟然不能設定圖片大小,簡直不能忍,啥也不說了,直接上程式碼
<!--drawableTextView-->
<declare-styleable name="DrawableTextView">
<attr name="leftDrawableWidth" format="dimension" />
<attr name="leftDrawableHeight" format="dimension" />
<attr name ="rightDrawableWidth" format="dimension" />
<attr name="rightDrawableHeight" format="dimension" />
<attr name="topDrawableWidth" format="dimension" />
<attr name="topDrawableHeight" format="dimension" />
<attr name="bottomDrawableWidth" format="dimension" />
<attr name="bottomDrawableHeight" format="dimension" />
<attr name="addTail" format="boolean"/>
</declare-styleable>
繼承自TextView,直接在佈局檔案使用即可,在可以設定圖片大小的前提下,進行了擴充套件,使其可以使用在更多的場景
例如:
以上場景就可以使用在多行文字的表現形式,然後使用spannableString 或者spannableStringBuilder 實現更多更復雜的表現形式
/**
* Drawable 監聽回撥介面
*
* Created by yinw on 2016-12-19.
*/
public class DrawableListener {
public interface DrawableRightListener{
void drawableRightListener(View view);
}
public interface DrawableLeftListener{
void drawableLeftListener(View view);
}
public interface DrawableTopListener{
void drawableTopListener(View view);
}
public interface DrawableBottomListener{
void drawableBottomListener(View view);
}
}
/**
* Created by yinw on 2016-12-07.
*/
public class DrawableTextView extends TextView {
private int leftDrawableWidth, leftDrawableHeight, rightDrawableWidth, rightDrawableHeight,
topDrawableWidth, topDrawableHeight, bottomDrawableWidth, bottomDrawableHeight;
private int leftWidth, rightWidth;//左右圖片寬度
private boolean addTail = false;//是否對換行符的長字串進行...替換
private final int DRAWABLE_LEFT = 0;
private final int DRAWABLE_TOP = 1;
private final int DRAWABLE_RIGHT = 2;
private final int DRAWABLE_BOTTOM = 3;
private DrawableListener.DrawableRightListener drawableRightListener;
private DrawableListener.DrawableLeftListener drawableLeftListener;
private DrawableListener.DrawableTopListener drawableTopListener;
private DrawableListener.DrawableBottomListener drawableBottomListener;
public DrawableTextView(Context context) {
this(context, null);
}
public DrawableTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public DrawableTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = 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()));
addTail = typedArray.getBoolean(R.styleable.DrawableTextView_addTail, false);
typedArray.recycle();
Drawable[] drawables = getCompoundDrawables();
for (int i = 0; i < drawables.length; i++) {
setDrawableSize(drawables[i], i);
}
//放置圖片
setCompoundDrawables(drawables[DRAWABLE_LEFT], drawables[DRAWABLE_TOP], drawables[DRAWABLE_RIGHT], drawables[DRAWABLE_BOTTOM]);
}
//設定drawableRight 圖片的點選監聽
public void setDrawableRightListener(DrawableListener.DrawableRightListener drawableRightListener) {
this.drawableRightListener = drawableRightListener;
}
public void setDrawableLeftListener(DrawableListener.DrawableLeftListener drawableLeftListener) {
this.drawableLeftListener = drawableLeftListener;
}
public void setDrawableTopListener(DrawableListener.DrawableTopListener drawableTopListener) {
this.drawableTopListener = drawableTopListener;
}
public void setDrawableBottomListener(DrawableListener.DrawableBottomListener drawableBottomListener) {
this.drawableBottomListener = drawableBottomListener;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
if (drawableRightListener != null) {
Drawable drawableRight = getCompoundDrawables()[DRAWABLE_RIGHT];
if (drawableRight != null && event.getRawX() >= (getRight() - drawableRight.getBounds().width())
&& event.getRawX() < getRight()) {
drawableRightListener.drawableRightListener(this);
return true;
}
}
if (drawableLeftListener != null) {
Drawable drawableLeft = getCompoundDrawables()[DRAWABLE_LEFT];
if (drawableLeft != null && event.getRawX() <= (getLeft() + drawableLeft.getBounds().width())
&& event.getRawX() > getLeft()) {
drawableLeftListener.drawableLeftListener(this);
return true;
}
}
if (drawableTopListener != null) {
Drawable drawableTop = getCompoundDrawables()[DRAWABLE_TOP];
if (drawableTop != null && event.getRawY() <= (getTop() + drawableTop.getBounds().height())
&& event.getRawY() > getTop()) {
drawableTopListener.drawableTopListener(this);
return true;
}
}
if (drawableBottomListener != null) {
Drawable drawableBottom = getCompoundDrawables()[DRAWABLE_BOTTOM];
if (drawableBottom != null && event.getRawY() >= (getBottom() - drawableBottom.getBounds().height())
&& event.getRawY() < getBottom()) {
drawableBottomListener.drawableBottomListener(this);
return true;
}
}
break;
}
return super.onTouchEvent(event);
}
//設定圖片的高度和寬度
private void setDrawableSize(Drawable drawable, int index) {
if (drawable == null) {
return;
}
//左上右下
int width = 0, height = 0;
switch (index) {
case DRAWABLE_LEFT:
width = leftDrawableWidth;
height = leftDrawableHeight;
break;
case DRAWABLE_TOP:
width = topDrawableWidth;
height = topDrawableHeight;
break;
case DRAWABLE_RIGHT:
width = rightDrawableWidth;
height = rightDrawableHeight;
break;
case DRAWABLE_BOTTOM:
width = bottomDrawableWidth;
height = bottomDrawableHeight;
break;
}
//如果沒有設定圖片的高度和寬度具使用預設的圖片高度和寬度
if (width < 0) {
width = drawable.getIntrinsicWidth();
}
if (height < 0) {
height = drawable.getIntrinsicHeight();
}
if (index == 0) {
leftWidth = width;
} else if (index == 2) {
rightWidth = width;
}
drawable.setBounds(0, 0, width, height);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//是否對包含有換行符的文字,以換行符分割的句子,超過textView最大寬度的時候以“...”結尾
if (addTail) {
String text = getText().toString();
float textWidth = getWidth() - getPaddingRight() - getPaddingLeft();
if (leftWidth != 0) {
textWidth = textWidth - leftWidth - getCompoundDrawablePadding();
}
if (rightWidth != 0) {
textWidth = textWidth - rightWidth - getCompoundDrawablePadding();
}
setText(changeText(text, textWidth));
}
}
/**
* 以換行符\n來分離文字,每行超過最大長度的文字以...來替換 可以少寫很多的textView
*
* @param text 文字內容
* @param textWidth 文字最大長度
* @return
*/
private String changeText(String text, float textWidth) {
String[] contents = text.split("\\n");
float contentWidth;
String content;
for (int j = 0; j < contents.length; j++) {
content = contents[j];
contentWidth = this.getPaint().measureText(content);
if (contentWidth > textWidth) {
String newContent;
float newContentWidth;
for (int i = content.length(); i >= 0; i--) {
newContent = content.substring(0, i);
newContentWidth = this.getPaint().measureText(newContent + "...");
if (newContentWidth <= textWidth) {
contents[j] = newContent.concat("...");
break;
}
}
}
}
StringBuilder stringBuilder = new StringBuilder();
for (int k=0;k<contents.length;k++) {
if(k<contents.length-1) {
stringBuilder.append(contents[k] + "\n");
}else{
stringBuilder.append(contents[k]);
}
}
return stringBuilder.toString();
}
}
相關推薦
Android textView drawableXX圖片大小
TextView自帶的drawableLeft屬性竟然不能設定圖片大小,簡直不能忍,啥也不說了,直接上程式碼 <!--drawableTextView--> <declare-styleable name="Drawabl
Android 自定義view-如何設定TextView drawableLeft 圖片大小?
2017/09/07更新 開發過程中,越發強烈的覺得需要對TextView進一步封裝 1.TextView需要設定背景或者邊框時需要編寫大量的selector,稍微修改一下樣式又得編寫一個新的selector,這個實在不能忍! 2.使用原生TextView
Android TextView設定圖片的大小
tv_block = (TextView) findViewById(R.id.block); //獲取資原始檔 Drawable d = ContextCompat.getDrawable(WorkoutDetailActivity.this,R.drawable.blo
android TextView中圖片和文字的灰顯
在某種情況下,menu的某一子項(圖示和文字)要求不能點選並且灰顯。 1. menu子項 menu_item.xml <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http:
控制TextView左側圖片大小的方法
Drawable img = ContextCompat.getDrawable(mContext, R.mipmap.asr_period_collection_ok); img.setBounds(0, 0, img.getIntrinsicWidth(), img.
Android設定drawableleft圖片大小
xml沒有屬性設定從程式碼裡可以Drawable drawable=getResources().getDrawable(R.drawable.ic_phone); drawable.setBounds
Android設定drawableTop圖片大小
在開發中我們經常用到TextView、Button、RadioButton這三個控制元件,很多時候我們需要文字和圖片一起出現,很多應用的底部的導航欄用RadioGroup來實現切換的功能,例如QQ等等,這時候我們要用RadioButton的drawableTop
android TextView 載入html 顯示圖片並且新增img標籤點選事件工具類 富文字 圖文混排 圖片大小調整
注意,本人部落格主要是為了自己記錄,如果有問題歡迎反饋哈。 android的TextView可以載入html程式碼,並且識別他們的標籤,用的方法就是setText(Html.fromHtml(source)),其中source是指定的字串,包含html標籤,用setText
Android項目實戰(五):TextView自適應大小
click set view ddd isp lap src 無法顯示 aaa 原文:Android項目實戰(五):TextView自適應大小對於設置TextView的字體默認大小對於UI界面的好看程度是很重要的,小屏幕設置的文字過大或者大屏幕設置的文字過小都造成UI的不美
Android 獲取指定圖片或檔案的大小
/** * 獲取指定檔案大小 */ public static long getFileSize(File file) throws Exception { long size = 0; if (file.exists()) { FileInputStrea
android TextView空間的setTextSize()方法在真機上執行大小問題
今天除錯一個專案,點選控制元件,放大或縮小TextView中的文字字型大小 它在虛擬機器上能正常執行,但在真機上出現錯誤 給段程式碼: viewText.setTextSize(viewText.getTextSize()-5); System.out.println("viewTi
在textView中新增圖片並設定圖片大小
在TextView中新增圖片並設定圖片大小,按照如下方法即可: Drawable drawable = ContextCompat.getDrawable(getApplicationContext(), R.drawable.icon_arrow_mine); &nb
Android.拍照,儲存圖片,圖片大小是0B...
拍照,儲存圖片,大小為0B. 真是嗶了狗了,找了一晚上+一上午才發現問題. 對著官方文件看了幾遍,沒發現啥毛病啊,就是儲存到本地的圖片大小是0B. 整體流程. 其實沒什麼好說的… 判斷許可權 =&g
android textview使用ttf字型顯示圖片
最近在研究一個元件時,發現使用textview顯示了一張圖片,原以為android原生支援,仔細研究了下,是用ttf字型實現的,記錄下 網上的介紹文章很多,這裡就不囉嗦了,連結 https://www.jianshu.com/p/ba1d076a1e31 這裡補充幾點:
Android TextView中有圖片有文字混合排列
Android TextView中有圖片有文字混合排列 1.使用html.fromHtml 2.新建ImageGetter 3.使用<img src>標籤 demo: 1.設定文字 ((TextView) findVi
Android TextView使用HTML處理字型樣式、顯示圖片等
學Android的時候突然想到一個問題:怎麼用TextView控制元件顯示帶有格式的文字,可否使用Html佈局?查了下Android 幫助文件,其提供了android.text.Html類和Html.ImageGetter、Html.TagHandler介
Android動態更改TextView的字型大小
需求: 需要動態更改TextView內容字型的大小,比如設定TextView只有一行,寬度只有200dp,內容超過這個之後就縮小字型顯示,只能能將字型都顯示完全;也就是動態更改TextView的字型大小,當TextView的內容比較多時縮小顯示,當Tex
Android-->RatingBar自定義大小,自定義樣式(圖片)
1:首先宣告自定義RatingBar的樣式(values/styles.xml) <style name="RadingStyle" parent="@android:style/Widget.RatingBar"> <!-- 定義星
Android 中同一個TextView設定不同大小字型
今天遇到一個需求,價格的第一個字要比後面的大,之前有遇到過用spannable設定不同字母的顏色,所以想著應該也可以設定不同大小吧,現整理一下基本用法方便以後使用。 price = Tools.formatToSepara(item.price); i
Android TextView部分字型變色或字型變大小
A. SpannableStringBuilder style=new SpannableStringBuilder(str); //SpannableStringBuilder實現CharSequence介面 style.setSpan(new Foreground