`
bcyy
  • 浏览: 1817781 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

实例:ConstomTextView

实现步骤:

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

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

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

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

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

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

项目运行效果:

2秒过后。。。

源代码: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) {
		//遍历ArrayList
		for(HashMap<String, String> hashMap : datas) {
			//获取key为"type"的值
			String type = hashMap.get("type");
			//如果value=imaeg
			if(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;
		}


		@Override
		public void run() {
			// TODO Auto-generated method stub
			Drawable 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 exception
				e.printStackTrace();
			}
			//让线程休眠2秒
			SystemClock.sleep(2000);
			//使用Handler更新UI
			Message 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>


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics