1. 程式人生 > >Android TextView中顯示圖片的4種方式

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

jQueryajax的4常用請求方式

ger loaded resource media val als images 詳細 有一個 jQuery中ajax的4種常用請求方式: 1.$.ajax()返回其創建的 XMLHttpRequest 對象。 $.ajax() 只有一個參數:參數 key/va

mysqllike語法拼接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

AndroidIPC的幾方式詳細分析與優缺點分析

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