package com.emop.client.widget.item;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.Toast;
import com.emop.client.R;
import com.emop.client.TaokeItemDetailActivity;
import com.emop.client.io.FmeiClient;
import com.emop.client.io.ImageLoader;
import com.emop.client.provider.Schema;
import com.emop.client.widget.Constants;
public class FlowView extends ImageView implements View.OnClickListener,
View.OnLongClickListener {
public static ImageLoader imageLoader = null;
private Paint mPaint = new Paint();
private Context context;
public int fontSize = 0;
public Bitmap bitmap;
public float rectRate = 0;
public int topMargin = 0;
public int bottomMargin = 0;
private int columnIndex;// 图片属于第几列
private int rowIndex;// 图片属于第几行
private String fileName;
private int ItemWidth;
private Handler viewHandler;
private int reloadTimes = 0;
private long lastLoadTime = 0;
/**
* 商品价格
* @todo -- 移到更合理的位置。这个是和瀑布流相关的一个控件。最好不要和特定
* 的业务场景相关。
*/
public float price;
public FlowView(Context c, AttributeSet attrs, int defStyle) {
super(c, attrs, defStyle);
this.context = c;
Init();
}
public FlowView(Context c, AttributeSet attrs) {
super(c, attrs);
this.context = c;
Init();
}
public FlowView(Context c) {
super(c);
this.context = c;
Init();
}
private void Init() {
if(imageLoader == null){
imageLoader = FmeiClient.getInstance(null).appImgLoader;
}
setBackgroundColor(Color.WHITE);
setOnClickListener(this);
setOnLongClickListener(this);
setAdjustViewBounds(true);
this.setScaleType(ScaleType.CENTER_CROP);
}
@Override
public void onClick(View v) {
Log.d("FlowView", "Click");
//Toast.makeText(context, "单击:" + getId(), Toast.LENGTH_SHORT).show();
Uri dataUri = Uri.parse("content://" + Schema.AUTHORITY + "/item/" + getId());
Intent intent = new Intent().setClass(context,
TaokeItemDetailActivity.class);
intent.setData(dataUri);
context.startActivity(intent);
}
/**
* 加载图片
*/
public void LoadImage() {
//this.getMeasuredWidth()
//Log.d("xxx", "load image:" + this.getId());
if(this.rectRate > 0){
imageLoader.loadToCache(getFileName(), getItemWidth(), true);
int layoutHeight = (int)(getItemWidth() / rectRate);// 调整高度
LayoutParams lp = getLayoutParams();
int showHeight = layoutHeight - topMargin - bottomMargin - bottomMargin;
if (lp == null) {
lp = new LayoutParams(getItemWidth(), showHeight);
}
lp.height = showHeight;
//Log.d("xx", "add image rate:" + rectRate + "mw:"+ getMeasuredWidth() + ", width:" + getItemWidth() + ", height:" + layoutHeight + ",topMargin:" + topMargin);
setLayoutParams(lp);
setScaleType(ScaleType.CENTER_CROP);
setBackgroundResource(R.drawable.guang_image_border);
Handler h = getViewHandler();
Message m = h.obtainMessage(Constants.HANDLER_WHAT,
getItemWidth(), layoutHeight, FlowView.this);
//h.sendMessage(m);
h.dispatchMessage(m);
}else {
imageLoader.runTask(new LoadImageThread());
}
}
/**
* 重新加载图片
*/
public void Reload() {
if (this.bitmap == null && (reloadTimes <= 3 || System.currentTimeMillis() - lastLoadTime > 1000 * 4)) {
lastLoadTime = System.currentTimeMillis();
reloadTimes++;
//Log.d("xxxx", "reload img:" + this.fileName);
setScaleType(ScaleType.FIT_CENTER);
imageLoader.runTask(new Runnable(){
@Override
public void run() {
bitmap = imageLoader.cache.get(fileName, getItemWidth(), true);
if(bitmap != null){
imageLoader.handler.post(new Runnable(){
public void run(){
setImageBitmap(bitmap);
invalidate();
}
});
}
}
});
}
}
/**
* 回收内存
*/
public void recycle() {
if(this.bitmap == null) return;
//Log.d("xxxx", "recycle img:" + this.fileName);
setImageBitmap(null);
if(!bitmap.isRecycled()){
bitmap.recycle();
}
reloadTimes = 0;
this.bitmap = null;
}
public int getColumnIndex() {
return columnIndex;
}
public void setColumnIndex(int columnIndex) {
this.columnIndex = columnIndex;
}
public int getRowIndex() {
return rowIndex;
}
public void setRowIndex(int rowIndex) {
this.rowIndex = rowIndex;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public int getItemWidth() {
return ItemWidth;
}
public void setItemWidth(int itemWidth) {
ItemWidth = itemWidth;
}
public Handler getViewHandler() {
return viewHandler;
}
public FlowView setViewHandler(Handler viewHandler) {
this.viewHandler = viewHandler;
return this;
}
public void onDraw(Canvas canvas){
super.onDraw(canvas);
//如果还没有图片,尝试加载图片。
if(this.bitmap == null){
this.Reload();
}
drawExtraInfo(canvas);
int mh = this.getMeasuredHeight();
int mw = this.getMeasuredWidth();
//Log.d("xx", "show rate:" + rectRate + ", mw:" + mw + ", mh:" + mh);
}
private void drawExtraInfo(Canvas canvas){
mPaint.setTypeface(Typeface.DEFAULT);
mPaint.setTextSize(fontSize);
mPaint.setDither(false);
mPaint.setAntiAlias(true);
int mh = this.getMeasuredHeight();
int mw = this.getMeasuredWidth();
float minHeight = mPaint.getTextSize() + 4;
float maxHeight = mPaint.getTextSize() * 1.5f;
float height = (float)(mh * 0.25);
float margin = fontSize / 14 * 5;
height = height > minHeight ? height : minHeight;
height = height > maxHeight ? maxHeight : height;
mPaint.setColor(Color.BLACK);
mPaint.setAlpha(50);
float top = mh - height - margin;
final float roundPx = fontSize / 14 * 5;
String text = String.format("¥%1$1.0f", this.price);
float left = (mw - mPaint.measureText(text)); // / 2;
left = left > 0 ? left : 0;
final RectF rectF = new RectF(left - margin - roundPx * 2, top, mw - margin,
mh - margin);
canvas.drawRoundRect(rectF, roundPx, roundPx, mPaint);
float padding = (height - mPaint.getTextSize()) / 4f;
mPaint.setColor(Color.WHITE);
canvas.drawText(text, left - margin - roundPx, top + padding + mPaint.getTextSize(), mPaint);
}
class LoadImageThread extends Thread {
LoadImageThread() {
}
public void run() {
bitmap = imageLoader.cache.get(getFileName(), ItemWidth, true);
// if (bitmap != null) {
// 此处不能直接更新UI,否则会发生异常:
// CalledFromWrongThreadException: Only the original thread that
// created a view hierarchy can touch its views.
// 也可以使用Handler或者Looper发送Message解决这个问题
((Activity) context).runOnUiThread(new Runnable() {
public void run() {
if (bitmap != null) {// 此处在线程过多时可能为null
int width = bitmap.getWidth();// 获取真实宽高
int height = bitmap.getHeight();
LayoutParams lp = getLayoutParams();
// 减20为了尽量让高度,上下不留白边。
int layoutHeight = (height * getItemWidth()) / width;// 调整高度
int showHeight = layoutHeight - topMargin - bottomMargin * 2;
if (lp == null) {
lp = new LayoutParams(getItemWidth(), showHeight);
}
lp.height = showHeight;
setLayoutParams(lp);
setScaleType(ScaleType.CENTER_CROP);
setImageBitmap(bitmap);
Handler h = getViewHandler();
Message m = h.obtainMessage(Constants.HANDLER_WHAT,
getItemWidth(), layoutHeight, FlowView.this);
h.sendMessage(m);
}
}
});
}
}
@Override
public boolean onLongClick(View v) {
return false;
}
}