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>";
}
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);
}
}
}
<? 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 >
< 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 >