package org.aisen.weibo.sina.ui.widget; import org.aisen.weibo.sina.R; import org.aisen.weibo.sina.support.compress.Timeline9ggBitmapCompress; import org.aisen.weibo.sina.support.compress.TimelineBitmapCompress; import org.aisen.weibo.sina.support.compress.TimelineThumbBitmapCompress; import org.aisen.weibo.sina.support.utils.AppSettings; import org.aisen.weibo.sina.ui.fragment.base.BizFragment; import org.android.loader.BitmapLoader; import org.android.loader.core.BitmapOwner; import org.android.loader.core.ImageConfig; import org.sina.android.bean.PicUrls; import org.sina.android.bean.StatusContent; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import com.m.common.utils.Logger; import com.m.common.utils.SystemUtility; import com.m.common.utils.SystemUtility.NetWorkType; import com.m.ui.fragment.ABaseFragment; /** * timeline的图片容器,根据图片个数动态布局ImageView * * @author wangdan * */ public class TimelinePicsView extends ViewGroup implements BitmapOwner { public static final String TAG = TimelinePicsView.class.getSimpleName(); private int mWidth; private int gap; private PicUrls[] picUrls; private Rect[] picRects; private StatusContent mStatusContent; private boolean large = true; private BizFragment bizFragment; private ABaseFragment ownerFragment; public TimelinePicsView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public TimelinePicsView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public TimelinePicsView(Context context) { super(context); init(); } private void init() { mWidth = SystemUtility.getScreenWidth() - 2 * getResources().getDimensionPixelSize(R.dimen.horizontal_margin); gap = getResources().getDimensionPixelSize(R.dimen.gap_pics); Logger.v(TAG, String.format("screenWidth = %d", SystemUtility.getScreenWidth())); Logger.v(TAG, String.format("gap = %d, width = %d", gap, mWidth)); } private void recyle() { for (int i = 0; i < getChildCount(); i++) { ImageView imgView = (ImageView) getChildAt(i); imgView.setImageDrawable(BitmapLoader.getLoadingDrawable(imgView)); } } private void setMobileTimelinePicsView() { picRects = null; int size = picUrls.length; int imgW = Math.round((mWidth - 2 * gap) * 1.0f / 3.0f); int imgH = imgW; LinearLayout.LayoutParams layoutParams = null; // 4个特殊情况,上2个下2个 if (size == 4) { layoutParams = new LinearLayout.LayoutParams(mWidth, imgH * 2 + gap); picRects = new Rect[4]; Rect rect = new Rect(0, 0, imgW, imgH); picRects[0] = rect; rect = new Rect(imgW + gap, 0, imgW * 2 + gap, imgH); picRects[1] = rect; rect = new Rect(0, imgH + gap, imgW, imgH * 2 + gap); picRects[2] = rect; rect = new Rect(imgW + gap, imgH + gap, imgW * 2 + gap, imgH * 2 + gap); picRects[3] = rect; } else { int height = 0; switch (size) { case 1: case 2: case 3: height = imgH; break; case 5: case 6: height = imgH * 2 + gap; break; case 7: case 8: case 9: height = imgH * 3 + gap * 2; break; } layoutParams = new LinearLayout.LayoutParams(mWidth, height); picRects = getSmallRectArr(size); } setLayoutParams(layoutParams); displayPics(); // 重新绘制 requestLayout(); } private Rect[] getSmallRectArr(int size) { int imgW = Math.round((mWidth - 2 * gap) * 1.0f / 3.0f); int imgH = imgW; Rect[] tempRects = new Rect[9]; Rect rect = new Rect(0, 0, imgW, imgH); tempRects[0] = rect; rect = new Rect(imgW + gap, 0, imgW * 2 + gap, imgH); tempRects[1] = rect; rect = new Rect(mWidth - imgW, 0, mWidth, imgH); tempRects[2] = rect; rect = new Rect(0, imgH + gap, imgW, imgH * 2 + gap); tempRects[3] = rect; rect = new Rect(imgW + gap, imgH + gap, imgW * 2 + gap, imgH * 2 + gap); tempRects[4] = rect; rect = new Rect(mWidth - imgW, imgH + gap, mWidth, imgH * 2 + gap); tempRects[5] = rect; rect = new Rect(0, imgH * 2 + gap * 2, imgW, imgH * 3 + gap * 2); tempRects[6] = rect; rect = new Rect(imgW + gap, imgH * 2 + gap * 2, imgW * 2 + gap, imgH * 3 + gap * 2); tempRects[7] = rect; rect = new Rect(mWidth - imgW, imgH * 2 + gap * 2, mWidth, imgH * 3 + gap * 2); tempRects[8] = rect; Rect[] result = new Rect[size]; for (int i = 0; i < size; i++) result[i] = tempRects[i]; return result; } private void setWifiTimelinePicsView() { picRects = null; int size = picUrls.length; int random = 0; LinearLayout.LayoutParams layoutParams = null; Rect[] tempRects = new Rect[size]; switch (size) { case 1: int imgW = mWidth; int imgH = Math.round(imgW * 4.0f / 3.0f); Rect rect = new Rect((mWidth - imgW) / 2, 0, (mWidth - imgW) / 2 + imgW, imgH); tempRects[0] = rect; layoutParams = new LinearLayout.LayoutParams(mWidth, imgH); break; case 2: imgW = (mWidth - gap) / 2; imgH = Math.round(imgW * 4.0f / 3.0f); rect = new Rect(0, 0, imgW, imgH); tempRects[0] = rect; rect = new Rect(imgW + gap, 0, mWidth, imgH); tempRects[1] = rect; layoutParams = new LinearLayout.LayoutParams(mWidth, imgH); break; case 3: int imgW02 = Math.round((mWidth - gap) * 3.0f / 7.0f); int imgH02 = imgW02; int imgW01 = Math.round((mWidth - gap) * 4.0f / 7.0f); int imgH01 = imgH02 * 2 + gap; try { random = (int) (Long.parseLong(mStatusContent.getId()) % 2); } catch (Exception e) { } // 见/doc/3_0.png if (random == 0) { rect = new Rect(0, 0, imgW01, imgH01); tempRects[0] = rect; rect = new Rect(gap + imgW01, 0, mWidth, imgH02); tempRects[1] = rect; rect = new Rect(gap + imgW01, imgH02 + gap, mWidth, imgH01); tempRects[2] = rect; } // 见/doc/3_1.png else if (random == 1) { rect = new Rect(0, 0, imgW02, imgH02); tempRects[0] = rect; rect = new Rect(0, imgH02 + gap, imgW02, imgH01); tempRects[1] = rect; rect = new Rect(gap + imgW02, 0, mWidth, imgH01); tempRects[2] = rect; } layoutParams = new LinearLayout.LayoutParams(mWidth, imgH01); break; case 4: imgW = Math.round((mWidth - gap) * 1.0f / 2); imgH = Math.round(imgW * 4.0f / 3.0f); rect = new Rect(0, 0, imgW, imgH); tempRects[0] = rect; rect = new Rect(gap + imgW, 0, mWidth, imgH); tempRects[1] = rect; rect = new Rect(0, imgH + gap, imgW, imgH * 2 + gap); tempRects[2] = rect; rect = new Rect(gap + imgW, imgH + gap, mWidth, imgH * 2 + gap); tempRects[3] = rect; layoutParams = new LinearLayout.LayoutParams(mWidth, imgH * 2 + gap); break; case 5: imgW01 = Math.round((mWidth - gap) * 1.0f / 2); imgH01 = Math.round(imgW01 * 4.0f / 3.0f); imgW02 = Math.round((mWidth - gap * 2) * 1.0f / 3); imgH02 = Math.round(imgW02 * 4.0f / 3.0f); try { random = (int) (Long.parseLong(mStatusContent.getId()) % 2); } catch (Exception e) { } int height = imgH01 + imgH02 + gap; // 见/doc/5_0.png if (random == 0) { rect = new Rect(0, 0, imgW01, imgH01); tempRects[0] = rect; rect = new Rect(gap + imgW01, 0, mWidth, imgH01); tempRects[1] = rect; rect = new Rect(0, imgH01 + gap, imgW02, height); tempRects[2] = rect; rect = new Rect(imgW02 + gap, imgH01 + gap, imgW02 * 2 + gap, height); tempRects[3] = rect; rect = new Rect(mWidth - imgW02, imgH01 + gap, mWidth, height); tempRects[4] = rect; } // 见/doc/5_1.png else if (random == 1) { rect = new Rect(0, 0, imgW02, imgH02); tempRects[0] = rect; rect = new Rect(imgW02 + gap, 0, imgW02 * 2 + gap, imgH02); tempRects[1] = rect; rect = new Rect(mWidth - imgW02, 0, mWidth, imgH02); tempRects[2] = rect; rect = new Rect(0, imgH02 + gap, imgW01, height); tempRects[3] = rect; rect = new Rect(gap + imgW01, imgH02 + gap, mWidth, height); tempRects[4] = rect; } layoutParams = new LinearLayout.LayoutParams(mWidth, imgH01 + imgH02 + gap); break; case 6: imgW01 = Math.round((mWidth - 2 * gap) * 1.0f / 3.0f); imgH01 = Math.round(imgW01 * 4.0f / 3.0f); imgW02 = imgW01 * 2 + gap; imgH02 = imgH01 * 2 + gap; height = imgH01 + imgH02 + gap; try { random = (int) (Long.parseLong(mStatusContent.getId()) % 3); } catch (Exception e) { } // 见/doc/6_0.png if (random == 0) { rect = new Rect(0, 0, imgW01, imgH01); tempRects[0] = rect; rect = new Rect(gap + imgW01, 0, imgW01 * 2 + gap, imgH01); tempRects[1] = rect; rect = new Rect(mWidth - imgW01, 0, mWidth, imgH01); tempRects[2] = rect; rect = new Rect(0, imgH01 + gap, imgW02, height); tempRects[3] = rect; rect = new Rect(imgW02 + gap, imgH01 + gap, mWidth, height - imgH01 - gap); tempRects[4] = rect; rect = new Rect(imgW02 + gap, height - imgH01, mWidth, height); tempRects[5] = rect; } // 见/doc/6_1.png else if (random == 1) { rect = new Rect(0, 0, imgW01, imgH01); tempRects[0] = rect; rect = new Rect(0, imgH01 + gap, imgW01, imgH01 * 2 + gap); tempRects[1] = rect; rect = new Rect(gap + imgW01, 0, mWidth, imgH02); tempRects[2] = rect; rect = new Rect(0, height - imgH01, imgW01, height); tempRects[3] = rect; rect = new Rect(gap + imgW01, height - imgH01, gap + imgW01 * 2, height); tempRects[4] = rect; rect = new Rect(imgW02 + gap, height - imgH01, mWidth, height); tempRects[5] = rect; } // 见/doc/6_2.png else if (random == 2) { rect = new Rect(0, 0, imgW02, imgH02); tempRects[0] = rect; rect = new Rect(imgW02 + gap, 0, mWidth, imgH01); tempRects[1] = rect; rect = new Rect(gap + imgW02, imgH01 + gap, mWidth, imgH01 * 2 + gap); tempRects[2] = rect; rect = new Rect(0, height - imgH01, imgW01, height); tempRects[3] = rect; rect = new Rect(gap + imgW01, height - imgH01, gap + imgW01 * 2, height); tempRects[4] = rect; rect = new Rect(imgW02 + gap, height - imgH01, mWidth, height); tempRects[5] = rect; } // 见/doc/6_3.png else if (random == 3) { rect = new Rect(0, 0, imgW01, imgH01); tempRects[0] = rect; rect = new Rect(gap + imgW01, 0, imgW01 * 2 + gap, imgH01); tempRects[1] = rect; rect = new Rect(mWidth - imgW01, 0, mWidth, imgH01); tempRects[2] = rect; rect = new Rect(0, imgH01 + gap, imgW01, imgH01 * 2 + gap); tempRects[3] = rect; rect = new Rect(0, height - imgH01, imgW01, height); tempRects[4] = rect; rect = new Rect(imgW01 + gap, imgH01 + gap, mWidth, height); tempRects[5] = rect; } layoutParams = new LinearLayout.LayoutParams(mWidth, height); break; case 7: imgW01 = Math.round((mWidth - 2 * gap) * 1.0f / 3.0f); imgH01 = Math.round(imgW01 * 4.0f / 3.0f); imgW02 = mWidth; imgH02 = Math.round(imgW02 * 3.0f / 4.0f); height = imgH01 * 2 + imgH02 + gap * 2; rect = new Rect(0, 0, imgW01, imgH01); tempRects[0] = rect; rect = new Rect(gap + imgW01, 0, imgW01 * 2 + gap, imgH01); tempRects[1] = rect; rect = new Rect(mWidth - imgW01, 0, mWidth, imgH01); tempRects[2] = rect; rect = new Rect(0, imgH01 + gap, imgW02, imgH01 + gap + imgH02); tempRects[3] = rect; rect = new Rect(0, imgH01 + gap * 2 + imgH02, imgW01, height); tempRects[4] = rect; rect = new Rect(gap + imgW01, imgH01 + gap * 2 + imgH02, imgW01 * 2 + gap, height); tempRects[5] = rect; rect = new Rect(mWidth - imgW01, imgH01 + gap * 2 + imgH02, mWidth, height); tempRects[6] = rect; layoutParams = new LinearLayout.LayoutParams(mWidth, height); break; case 8: imgW01 = Math.round((mWidth - 2 * gap) * 1.0f / 3.0f); imgH01 = Math.round(imgW01 * 4.0f / 3.0f); imgW02 = Math.round((mWidth - gap) * 1.0f / 2.0f); imgH02 = Math.round(imgW02 * 4.0f / 3.0f); height = imgH01 * 2 + imgH02 + gap * 2; rect = new Rect(0, 0, imgW01, imgH01); tempRects[0] = rect; rect = new Rect(gap + imgW01, 0, imgW01 * 2 + gap, imgH01); tempRects[1] = rect; rect = new Rect(mWidth - imgW01, 0, mWidth, imgH01); tempRects[2] = rect; rect = new Rect(0, imgH01 + gap, imgW02, imgH01 + gap + imgH02); tempRects[3] = rect; rect = new Rect(imgW02 + gap, imgH01 + gap, mWidth, imgH01 + gap + imgH02); tempRects[4] = rect; rect = new Rect(0, imgH01 + gap * 2 + imgH02, imgW01, height); tempRects[5] = rect; rect = new Rect(gap + imgW01, imgH01 + gap * 2 + imgH02, imgW01 * 2 + gap, height); tempRects[6] = rect; rect = new Rect(mWidth - imgW01, imgH01 + gap * 2 + imgH02, mWidth, height); tempRects[7] = rect; layoutParams = new LinearLayout.LayoutParams(mWidth, height); break; case 9: imgW01 = Math.round((mWidth - 2 * gap) * 1.0f / 3.0f); imgH01 = Math.round(imgW01 * 4.0f / 3.0f); height = imgH01 * 2 + imgH01 + gap * 2; rect = new Rect(0, 0, imgW01, imgH01); tempRects[0] = rect; rect = new Rect(gap + imgW01, 0, imgW01 * 2 + gap, imgH01); tempRects[1] = rect; rect = new Rect(mWidth - imgW01, 0, mWidth, imgH01); tempRects[2] = rect; rect = new Rect(0, imgH01 + gap, imgW01, imgH01 * 2 + gap); tempRects[3] = rect; rect = new Rect(gap + imgW01, imgH01 + gap, imgW01 * 2 + gap, imgH01 * 2 + gap); tempRects[4] = rect; rect = new Rect(mWidth - imgW01, imgH01 + gap, mWidth, imgH01 * 2 + gap); tempRects[5] = rect; rect = new Rect(0, imgH01 + gap * 2 + imgH01, imgW01, height); tempRects[6] = rect; rect = new Rect(gap + imgW01, imgH01 + gap * 2 + imgH01, imgW01 * 2 + gap, height); tempRects[7] = rect; rect = new Rect(mWidth - imgW01, imgH01 + gap * 2 + imgH01, mWidth, height); tempRects[8] = rect; layoutParams = new LinearLayout.LayoutParams(mWidth, height); break; } setLayoutParams(layoutParams); picRects = tempRects; displayPics(); // 重新绘制 requestLayout(); } public void displayPics() { if (picRects == null || picUrls == null || picUrls.length == 0) return; for (int i = 0; i < getChildCount(); i++) { ImageView imgView = (ImageView) getChildAt(i); // 隐藏多余的View if (i >= picRects.length) { getChildAt(i).setVisibility(View.GONE); imgView.setImageDrawable(BitmapLoader.getLoadingDrawable(imgView)); } else { Rect imgRect = picRects[i]; imgView.setVisibility(View.VISIBLE); imgView.setLayoutParams(new ViewGroup.LayoutParams(imgRect.right - imgRect.left, imgRect.bottom - imgRect.top)); String url = getStatusMulImage(picUrls[i].getThumbnail_pic()); ImageConfig config = new ImageConfig(); if (large) config.setId("status_" + large + "_" + AppSettings.getPicLargeMode()); else config.setId("status_thumb"); config.setLoadfaildBitmapRes(R.drawable.bg_timeline_loading); config.setLoadingBitmapRes(R.drawable.bg_timeline_loading); config.setMaxWidth(imgRect.right - imgRect.left); config.setMaxHeight(imgRect.bottom - imgRect.top); if (url.equals(picUrls[i].getThumbnail_pic())) config.setBitmapCompress(TimelineThumbBitmapCompress.class); else if (AppSettings.getPicLargeMode() == 1) config.setBitmapCompress(Timeline9ggBitmapCompress.class); else config.setBitmapCompress(TimelineBitmapCompress.class); BitmapLoader.getInstance().display(this, url, imgView, config); if (bizFragment != null) { bizFragment.previousPics(imgView, mStatusContent, i); } } } } private String getStatusMulImage(String thumbImage) { if (large) { return thumbImage.replace("thumbnail", "bmiddle"); } else { return thumbImage; } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { if (picRects == null) return; for (int i = 0; i < getChildCount(); i++) { // 隐藏多余的View if (i < picRects.length) { Rect imgRect = picRects[i]; View childView = getChildAt(i); childView.layout(imgRect.left, imgRect.top, imgRect.right, imgRect.bottom); } else { break; } } } public void release() { Logger.v(TAG, "释放资源"); mStatusContent = null; for (int i = 0; i < getChildCount(); i++) { ImageView imgView = (ImageView) getChildAt(i); imgView.setImageDrawable(BitmapLoader.getLoadingDrawable(imgView)); } } public void setPics(StatusContent status, BizFragment bizFragment, ABaseFragment ownerFragment) { this.bizFragment = bizFragment; this.ownerFragment = ownerFragment; Logger.v(TAG, "加载图片"); @SuppressWarnings("unused") boolean replace = false; // 如果内容发送了改变 if (mStatusContent != null && mStatusContent.getId().equals(status.getId())) replace = true; // 如果图片模式是小图 if (AppSettings.getPictureMode() == 0) { if (large) replace = true; large = false; } // 如果图片模式是大图 else if (AppSettings.getPictureMode() == 1) { if (!large) replace = true; large = true; } // 图片模式是自动,且当前是WIFI网络 else if (AppSettings.getPictureMode() == 2 && SystemUtility.getNetworkType() == NetWorkType.wifi) { // 如果当前不是large if (!large) replace = true; large = true; } // 图片模式是自动,且当前是Mobile网络 else if (AppSettings.getPictureMode() == 2 && SystemUtility.getNetworkType() != NetWorkType.wifi) { // 如果当前不是large if (large) replace = true; large = false; } mStatusContent = status; PicUrls[] picUrls = mStatusContent.getPic_urls(); // 测试 // int size = ++loadCount % 9 + 1; // size = 9; // PicUrls p = new PicUrls(); // p.setThumbnail_pic("http://ww2.sinaimg.cn/bmiddle/661b513cjw1eivtz9s3fcj20bd08ct96.jpg"); // PicUrls[] tempPicUrls = new PicUrls[size]; // for (int i = 0; i < tempPicUrls.length; i++) { // if (picUrls != null && picUrls.length > i) // tempPicUrls[i] = picUrls[i]; // else // tempPicUrls[i] = p; // } // picUrls = tempPicUrls; this.picUrls = picUrls; if (picUrls == null || picUrls.length == 0) { recyle(); setVisibility(View.GONE); } else { setVisibility(View.VISIBLE); if (large && AppSettings.getPicLargeMode() == 0) { setWifiTimelinePicsView(); } else { setMobileTimelinePicsView(); } } } @Override public boolean canDisplay() { if (ownerFragment != null) return ownerFragment.canDisplay(); return true; } }