Android TextView中顯示圖片的4種方式
我們知道,TextView控制元件一般是用來顯示文字的,而圖片一般是用ImageView控制元件來顯示。
那TextView能否顯示圖片呢?答案是肯定的!下面列出常見的4種方式。
XML檔案中指定屬性值
這種方式應該是最常用的了,在TextView的左上右下顯示圖片,可用
android:drawableLeft
android:drawableTop
android:drawableRight
android:drawableBottom
比如我們要在TextView的頂部設定圖片,程式碼如下:
<TextView
android:id="@+id/textview_01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_launcher"
android:text="hello_world" />
這種顯示方式圖片跟文字是居中對齊的,此種方式對應的方法是setCompoundDrawablesWithIntrinsicBounds:
mTextView01.setCompoundDrawablesWithIntrinsicBounds(null,
getResources().getDrawable(R.drawable.ic_launcher, null ), null, null);
效果圖:
如果覺得圖片離文字太近,也可以設定他們之間的間距,xml或者程式碼中都可以實現:
android:drawablePadding="10dp"
或者
mTextView01.setCompoundDrawablePadding(10);
通過解析HTML來顯示圖片
這種方式可以顯示專案中的圖片、本地SDCARD和網路的圖片,當然網路的圖片必須先下載到本地然後顯示。
顯示專案中圖片
看程式碼
// 第二種方式:顯示專案中的圖片
mTextView02 = (TextView) findViewById(R.id.textview_02);
// 把圖片生成的ID加入img標籤中 <img src='123'>
String htmlFor02 = "專案圖片測試:" + "<img src='" + R.drawable.ic_launcher + "'>" + "<img src='"
+ R.drawable.apple + "'>";
mTextView02.setText(Html.fromHtml(htmlFor02, new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Log.d(TAG, "專案圖片測試_source:" + source);
int id = Integer.parseInt(source);
Drawable drawable = getResources().getDrawable(id, null);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth() ,
drawable.getIntrinsicHeight());
return drawable;
}
}, null));
可以看到,ic_launcher和apple這兩張圖片的ID是加到了img標籤中,然後通過實現html的ImageGetter介面中的getDrawable()方法取得圖片。
效果圖如下:
獲取網路圖片
為了簡化程式碼,我們用到了google的volley網路框架去請求圖片,然後儲存到sdcard再顯示,這種方式略顯麻煩,看程式碼:
private static final String htmlFor03 = "網路圖片測試:"
+ "<img src='http://img1.imgtn.bdimg.com/it/u=4190601239,967361436&fm=11&gp=0.jpg'>";
private static final String NET_PIC_NAME = "NetPic.png";
// 第二種方式:顯示網路圖片
mTextView03 = (TextView) findViewById(R.id.textview_03);
mTextView03.setText(Html.fromHtml(htmlFor03, mNetWorkImageGetter, null));
private NetWorkImageGetter mNetWorkImageGetter = new NetWorkImageGetter();
class NetWorkImageGetter implements Html.ImageGetter {
/*
* (non-Javadoc)
* @see android.text.Html.ImageGetter#getDrawable(java.lang.String)
*/
@Override
public Drawable getDrawable(String source) {
Drawable drawable = null;
File file = new File(Environment.getExternalStorageDirectory(), NET_PIC_NAME);
if (file.exists()) {
drawable = Drawable.createFromPath(file.getAbsolutePath());
drawable.setBounds(0, 0, drawable.getIntrinsicWidth() * 2,
drawable.getIntrinsicHeight() * 2);
} else {
getNetworkImg(source);
}
return drawable;
}
}
/**
* 通過volley請求網路圖片
* @param url
*/
private void getNetworkImg(String url) {
Log.d(TAG, "url: " + url);
RequestQueue queue = Volley.newRequestQueue(this);
ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
Log.d(TAG, "onResponse");
saveMyBitmap(NET_PIC_NAME, bitmap);
mTextView03.setText(Html.fromHtml(htmlFor03, mNetWorkImageGetter, null));
}
}, 0, 0, ScaleType.CENTER, Config.RGB_565, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(TAG, "onErrorResponse:" + error);
}
});
queue.add(request);
}
/**
* 儲存獲取到的網路圖片到sdcard
* @param bitName
* @param mBitmap
*/
public void saveMyBitmap(String bitName, Bitmap mBitmap) {
File f = new File("/sdcard/" + bitName);
try {
f.createNewFile();
} catch (IOException e) {
}
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
程式碼比較多,弄明白流程就行,先從本地找–>沒找到的話通過網路下載並儲存到本地–>顯示本地圖片。
效果圖如下:
通過ImageSpan和SpannableString
這種方式很簡單,通過新建ImageSpan物件得到圖片,然後作為引數傳入SpannableString的setSpan方法中即可。看程式碼:
// 第三種方式
mTextView04 = (TextView) findViewById(R.id.textview_04);
ImageSpan imgSpan = new ImageSpan(this, R.drawable.apple);
SpannableString spannableString = new SpannableString("012345");
spannableString.setSpan(imgSpan, 1, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView04.setText(spannableString);
注意:setSpan(Object what, int start, int end, int flags)方法中的start和end值是用圖片來取代的文字範圍,flags是用來標識在 Span 範圍內的文字前後輸入新的字元時是否把它們也應用這個效果。
效果圖:
通過繼承TextView方式
這種方式的原理是通過繼承TextView,並重寫onDraw(),讓圖片直接畫到文字上,這會導致圖片跟文字重疊,它們之間的間距不好控制。
public class MyTextView extends TextView {
private Bitmap mBitmap;
/**
* @param context
* @param attrs
*/
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
mBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.apple);
setTextSize(40);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(mBitmap, 0, 0, getPaint());
super.onDraw(canvas);
}
}
然後在xml檔案中引用自定義控制元件:
<com.example.imageintextview.MyTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/hello_world" />
效果圖:
Eclipse版DEMO下載: 點選下載
相關推薦
Android TextView中顯示圖片的4種方式
我們知道,TextView控制元件一般是用來顯示文字的,而圖片一般是用ImageView控制元件來顯示。 那TextView能否顯示圖片呢?答案是肯定的!下面列出常見的4種方式。 XML檔案中指定屬性值 這種方式應該是最常用的了,在TextVi
富文字在TextView中顯示圖片
最近在專案中有需求使用到了富文字,在android中我們設定TextView顯示富文字,如果不涉及圖片的話還是比較簡單的 TextView tv = new TextView(this); Spanned spanned = Html.fromHtml(content); tv.setT
Android TextView中有圖片有文字混合排列
Android TextView中有圖片有文字混合排列 1.使用html.fromHtml 2.新建ImageGetter 3.使用<img src>標籤 demo: 1.設定文字 ((TextView) findVi
Android TextView中顯示單行過長的用...代替
只需要xml檔案textview中新增 android:ellipsize="end" android:singleLine="true" 以上是最簡單的方法。 第二
Android TextView中插入圖片
CharSequence text = “自定義一個萬用字元”; SpannableStringBuilder builder = new SpannableStringBuilder
Android實現TextView中文字連結的4種方式介紹及程式碼
Android實現TextView中文字連結的方式有很多種;總結起來大概有4種:用Spannable或實現它的類,如SpannableString來格式,部分字串等等,感興趣的你可以參考下 Android 的實現TextView中文字連結的方式有很多種。 總結起來大概有4
Android載入html中的svg格式圖片進行顯示的兩種方式
最近做的一個專案是把assets目錄中的html顯示出來,但是因為html裡面有一些工程圖片,雖然我用ViewPager和PhotoView,進行顯示放大了,但是因為工程圖片的線條較多還是比較模糊.所以後來就想用svg圖片來進行顯示,至於svg是什麼,我這裡就不
Android介面設計的4種方式之二——在Java程式碼中控制UI介面
使用者介面設計是Android應用開發中最基本也是最重要的內容,在設計使用者介面時,首先需要了解介面中的UI元素如何呈現給使用者,也就是如何控制UI介面。在Android中提供了4種控制UI介面的方法,下面分別進行介紹。 Android介面概述 在Andro
android中跨程序通訊的4種方式
由於android系統中應用程式之間不能共享記憶體。因此,在不同應用程式之間互動資料(跨程序通訊)就稍微麻煩一些。在android SDK中提供了4種用於跨程序通訊的方式。這4種方式正好對應於android系統中4種應用程式元件:Activity、Content Prov
android TextView和EditText中顯示圖片
/** * 帶有\n換行符的字串都可以用此方法顯示2種顏色 * @param text * @param color1 * @param color2 * @return */ public SpannableStr
jQuery中ajax的4種常用請求方式
ger loaded resource media val als images 詳細 有一個 jQuery中ajax的4種常用請求方式: 1.$.ajax()返回其創建的 XMLHttpRequest 對象。 $.ajax() 只有一個參數:參數 key/va
mysql中like語法拼接4種方式
在mysql中,字串與字串之間用空格連線相當於拼接,'a' 'b' 'c' 相當於 'abc' 'a'"b"'c'雖然沒用空格,但由於是不同的字串型別,故也相當於拼接後的'abc'或"abc" 在mysql中,like語法本身為: like '%str%' 解析:like與
(S)CSS中實現主題樣式的4½種方式 [譯]
原Slides: 4½ Methods for Theming in (S)CSS ; 作者: Harry Roberts PM說要實現一個一鍵設定主題的功能,作為技術,你能想到的實現方式有哪些呢? 1. 什麼是主題樣式? 相信大家對網頁的主題樣式功能肯定不陌生。對於一些站點,在基礎樣式上,開
呼叫Action中的自定義方法(4種方式)
Action中的execute()方法是預設方法,在執行時被自動呼叫。但也允許在Action中自定義方法。可以在Action中自定義多個方法,分別處理不同的邏輯。當Action 中使用了自定義方法,該Action 就需要特定的配置,一般有四種呼叫方式: (1)使
MFC(4):靜態文字框使用及在靜態文字框中顯示圖片
=========================靜態文字框==================== 類似的QT中的Qlabel 選中static text,由於其預設ID為IDC_STATIC,因此要,右鍵-->屬性-->修改其ID,右鍵-->新增變數(修改訪問屬性、設定變數
android studio中顯示一段文字文字TextView
在<LinearLayout>之間加入 <TextView android:id="@+id/text_view" android:layout_width="match_parent" android:la
android 動態修改textView顏色大小的兩種方式
String resource = mData.get(position); int indexOf = resource.indexOf(":"); String t
Android中IPC的幾種方式詳細分析與優缺點分析
Android程序間通訊(IPC:Inter-Process Communication)的幾種主要方式如下 1.使用Bundle ----> 用於android四大元件間的程序間通訊 android的四大元件都可使用Bundle傳遞資料 所以如果要實現四大元
複製圖片的4種方式(copy圖片只能用位元組流物件)
package cn.itcast_01; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileI
html 圖片顯示的幾種方式
1,直接訪問:<img src="xxx/123.png"> 2,間接訪問:<img src="./request.rsp?opt=capture"> 需要CGI配合,返回的資料為圖片資料 重點在這:Content-type: image/jpeg