读书人

Android-自定义TextView跟异步加载图片

发布时间: 2012-11-23 00:03:43 作者: rapoo

Android-自定义TextView和异步加载图片的实现

Android-自定义TextView和异步加载图片的实现

实例:ConstomTextView

实现步骤:

1. 定义一个继承LinearLayout的类:ConstomTextView

2. 在ConstomTextView类中自定义setText()方法

3.在setText方法中,通过TypedArray来获取自定义属性,来设置组件相应的参数

4.如果要在布局中显示出图片就应该定义ImageView,显示出文本就定义TextView,以此类推

5. 最后要将组件通过addView()方法添加到布局当中。

6. 要实现图片异步加载,需要定义一个线程类,通过Handler来进行数据交互,来达到UI的更新

项目运行效果:

Android-自定义TextView跟异步加载图片的实现 2秒过后。。。Android-自定义TextView跟异步加载图片的实现

源代码:MainActivity.java

package com.wwj.textView;import java.util.ArrayList;import java.util.HashMap;import android.os.Bundle;import android.app.Activity;public class MainActivity extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                /**********************测试数据**********************/        ArrayList<HashMap<String, String>> datas = new ArrayList<HashMap<String,String>>();        HashMap<String, String> hashMap1 = new HashMap<String, String>();        hashMap1.put("type", "image");        hashMap1.put("value", "http://www.taoqao.com/uploads/allimg/111216/1-111216101257.png");        HashMap<String, String> hashMap2 = new HashMap<String, String>();        hashMap2.put("type", "text");        hashMap2.put("value", newsbody);        HashMap<String, String> hashMap3 = new HashMap<String, String>();        hashMap3.put("type", "image");        hashMap3.put("value", "http://www.taoqao.com/uploads/allimg/111216/1-111216101257.png");        datas.add(hashMap1);        datas.add(hashMap2);        datas.add(hashMap3);      /*************************************************************************/        //获取自定义组件的引用        ConstomTextView view = (ConstomTextView) findViewById(R.id.textView);        //调用ConstomTextView自定义的setText方法        view.setText(datas);    }        //新闻信息    private final String newsbody = " <p>  今年浙江卫视凭《中国好声音》一举做大" +    ",其巨大的影响力直接波及到了各家卫视“跨年晚会”的战略部署。日前" +    ",“跨年晚会”概念的鼻祖湖南卫视率先表示“退出跨年烧钱大战”。" +    "但据湖南卫视内部人士透露,即使如此,今年的湖南跨年晚会也将会掂出“跨年季”这个概念" +    ",“也就是从12月27日到12月31日,连续五天,我们将相继用《百变大咖秀》、《快乐大本营》" +    "、《女人如歌》、《天天向上》的特别节目来连续打造这个”季“的概念,直到12月31日的那场晚会。”</p>";}


源代码:ConstomTextView.java

package com.wwj.textView;import java.net.URL;import java.util.ArrayList;import java.util.HashMap;import android.content.Context;import android.content.res.TypedArray;import android.graphics.drawable.Drawable;import android.os.Handler;import android.os.Message;import android.os.SystemClock;import android.text.Html;import android.util.AttributeSet;import android.view.Gravity;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;public class ConstomTextView extends LinearLayout{//上下文对象private Context mContext;//声明TypedArray的引用private TypedArray mTypedArray;//布局参数private LayoutParams params;public ConstomTextView(Context context) {super(context);}public ConstomTextView(Context context, AttributeSet attrs) {super(context, attrs);this.mContext = context;this.setOrientation(LinearLayout.VERTICAL);//从attrs.xml文件中那个获取自定义属性mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.constomTextView);}public void setText(ArrayList<HashMap<String, String>> datas) {//遍历ArrayListfor(HashMap<String, String> hashMap : datas) {//获取key为"type"的值String type = hashMap.get("type");//如果value=imaegif(type.equals("image")){//获取自定义属性属性int imagewidth = mTypedArray.getDimensionPixelOffset(R.styleable.constomTextView_image_width, 100);int imageheight = mTypedArray.getDimensionPixelOffset(R.styleable.constomTextView_image_height, 100);ImageView imageView = new ImageView(mContext);params = new LayoutParams(imagewidth, imageheight);params.gravity = Gravity.CENTER_HORIZONTAL;//居中imageView.setLayoutParams(params);//显示图片imageView.setImageResource(R.drawable.ic_constom);//将imageView添加到LinearLayout当中addView(imageView);//启动异步线程更新异步显示图片信息new DownloadPicThread(imageView, hashMap.get("value")).start();}else {float textSize = mTypedArray.getDimension(R.styleable.constomTextView_textSize, 16);int textColor = mTypedArray.getColor(R.styleable.constomTextView_textColor, 0xFF0000FF);TextView textView = new TextView(mContext);textView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));textView.setText(Html.fromHtml(hashMap.get("value")));textView.setTextSize(textSize);//设置字体大小textView.setTextColor(textColor);//设置字体颜色addView(textView);}}}private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {@SuppressWarnings("unchecked")HashMap<String, Object> hashMap = (HashMap<String, Object>) msg.obj;ImageView imageView = (ImageView) hashMap.get("imageView");LayoutParams params = new LayoutParams(msg.arg1, msg.arg2);params.gravity = Gravity.CENTER_HORIZONTAL;//居中imageView.setLayoutParams(params);Drawable drawable = (Drawable) hashMap.get("drawable");imageView.setImageDrawable(drawable);//显示图片};};/** * 定义一个线程类,异步加载图片 * @author Administrator * */private class DownloadPicThread extends Thread {private ImageView imageView;private String mUrl;public DownloadPicThread(ImageView imageView, String mUrl) {super();this.imageView = imageView;this.mUrl = mUrl;}@Overridepublic void run() {// TODO Auto-generated method stubDrawable drawable = null;int newImgWidth = 0;int newImgHeight = 0;try {drawable = Drawable.createFromStream(new URL(mUrl).openStream(), "image");//对图片进行缩放newImgWidth = drawable.getIntrinsicWidth() / 3;newImgHeight = drawable.getIntrinsicHeight() / 3;} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}//让线程休眠2秒SystemClock.sleep(2000);//使用Handler更新UIMessage msg = handler.obtainMessage();HashMap<String, Object> hashMap = new HashMap<String, Object>();hashMap.put("imageView", imageView);hashMap.put("drawable", drawable);msg.obj = hashMap;msg.arg1 = newImgWidth;msg.arg2 = newImgHeight;handler.sendMessage(msg);}}}


自定义属性:/values/attrs.xml

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="constomTextView">        <attr name="image_width" format="dimension"/>        <attr name="image_height" format="dimension"/>        <attr name="textColor" format="color"/>        <attr name="textSize" format="dimension"/>    </declare-styleable></resources>


布局文件:main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:wwj="http://schemas.android.com/apk/res/com.wwj.textView"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/LinearLayout1"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <com.wwj.textView.ConstomTextView        android:id="@+id/textView"        android:layout_width="fill_parent"        android:layout_height="wrap_content"         wwj:image_width="200dip"        wwj:image_height="52dip"/></LinearLayout>


1楼zgzhaobo昨天 22:13
xmlns:wwj="http://schemas.android.com/apk/res/com.wwj.textView" 这个貌似有错,需改为nxmlns:wwj="http://schemas.android.com/com.wwj.textView"
Re: wwj_748昨天 08:33
回复zgzhaobon谢谢,我会看看

读书人网 >Android

热点推荐