package cn.mutils.app.ui.photo; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView.ScaleType; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; import com.lidroid.xutils.BitmapUtils; import com.lidroid.xutils.bitmap.BitmapDisplayConfig; import com.lidroid.xutils.bitmap.callback.BitmapLoadFrom; import java.util.List; import cn.mutils.app.event.listener.AppBitmapLoadCallBack; import cn.mutils.app.event.listener.OnSelectedChangeListener; import cn.mutils.core.event.Dispatcher; import cn.mutils.core.event.IListener; import uk.co.senab.photoview.PhotoView; import uk.co.senab.photoview.PhotoViewAttacher; @SuppressLint("SetTextI18n") @SuppressWarnings({"deprecation", "ResourceType"}) public class PhotoContainer extends RelativeLayout { protected final int BOTTOM_ID = 1; protected HackyViewPager mPager; protected View mBottom; protected TextView mIndicator; protected PhotoPagerAdapter mAdapter; protected BitmapUtils mBitmapUtils; protected Dispatcher mDispatcher; public PhotoContainer(Context context) { super(context); init(context, null); } public PhotoContainer(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public PhotoContainer(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs); } protected void init(Context context, AttributeSet attrs) { this.setBackgroundColor(0xFF000000); mDispatcher = new Dispatcher(); mBitmapUtils = new BitmapUtils(context); mAdapter = new PhotoPagerAdapter(); mPager = new HackyViewPager(context); mPager.setAdapter(mAdapter); mPager.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)); mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { mIndicator.setText((position + 1) + "/" + mAdapter.getCount()); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageScrollStateChanged(int state) { } }); this.addView(mPager); mBottom = new View(context); mBottom.setId(BOTTOM_ID); RelativeLayout.LayoutParams bottomParams = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, 0); bottomParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); mBottom.setLayoutParams(bottomParams); this.addView(mBottom); GradientDrawable indicatorDrawable = new GradientDrawable(); indicatorDrawable.setColor(0x88000000); indicatorDrawable.setCornerRadius(10); mIndicator = new TextView(context); mIndicator.setBackgroundDrawable(indicatorDrawable); mIndicator.setTextColor(0xFFFFFFFF); mIndicator.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); mIndicator.setPadding(20, 8, 20, 8); mIndicator.setGravity(Gravity.CENTER); mIndicator.setVisibility(View.GONE); RelativeLayout.LayoutParams indicatorParams = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); indicatorParams.addRule(RelativeLayout.CENTER_HORIZONTAL); indicatorParams.addRule(RelativeLayout.ABOVE, BOTTOM_ID); indicatorParams.setMargins(10, 10, 10, 10); mIndicator.setLayoutParams(indicatorParams); this.addView(mIndicator); } public void setOnSelectedChangeListener(OnSelectedChangeListener listener) { mDispatcher.setListener(listener); } public void setDataProvider(List<String> dataProvider) { setDataProvider(dataProvider, 0); } public void setDataProvider(List<String> dataProvider, int displayedIndex) { mAdapter.setDataProvider(dataProvider); int adapterCount = mAdapter.getCount(); if (adapterCount > 0) { mIndicator.setVisibility(View.VISIBLE); if (displayedIndex >= 0 && displayedIndex < adapterCount) { mIndicator.setText((displayedIndex + 1) + "/" + adapterCount); mPager.setCurrentItem(displayedIndex); } else { mIndicator.setText("1/" + adapterCount); mPager.setCurrentItem(0); } } else { mIndicator.setVisibility(View.GONE); } } class PhotoPagerAdapter extends PagerAdapter { protected List<String> mDataProvider; @Override public int getCount() { if (mDataProvider == null) { return 0; } return mDataProvider.size(); } public void setDataProvider(List<String> dataProvider) { mDataProvider = dataProvider; notifyDataSetChanged(); } @Override public View instantiateItem(ViewGroup container, int position) { RelativeLayout layout = new RelativeLayout(getContext()); final PhotoView photoView = new PhotoView(getContext()); photoView.setTag(position); photoView.setOnViewTapListener(new PhotoViewAttacher.OnViewTapListener() { @Override public void onViewTap(View view, float x, float y) { Object o = view.getTag(); if (!(o instanceof Integer)) { return; } Integer position = (Integer) o; IListener listener = mDispatcher.getListener(); if (listener == null) { return; } ((OnSelectedChangeListener) listener).onChanged(PhotoContainer.this, position); } }); photoView.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)); final ProgressBar progressBar = new ProgressBar(getContext(), null, android.R.attr.progressBarStyleLarge); progressBar.setVisibility(View.GONE); RelativeLayout.LayoutParams progressBarParams = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); progressBarParams.addRule(RelativeLayout.CENTER_IN_PARENT); progressBar.setLayoutParams(progressBarParams); mBitmapUtils.display(photoView, mDataProvider.get(position), new AppBitmapLoadCallBack<View>() { @Override public void onLoadFailed(View container, String uri, Drawable drawable) { progressBar.setVisibility(View.GONE); super.onLoadFailed(container, uri, drawable); } @Override public void onLoadCompleted(View container, String uri, Bitmap bitmap, BitmapDisplayConfig config, BitmapLoadFrom from) { progressBar.setVisibility(View.GONE); DisplayMetrics displayMetrics = container.getContext().getResources().getDisplayMetrics(); if (bitmap.getWidth() < displayMetrics.widthPixels * 0.4 && bitmap.getHeight() < displayMetrics.widthPixels * 0.4) { photoView.setScaleType(ScaleType.CENTER_INSIDE); } super.onLoadCompleted(container, uri, bitmap, config, from); } @Override public void onLoading(View container, String uri, BitmapDisplayConfig config, long total, long current) { progressBar.setVisibility(View.VISIBLE); super.onLoading(container, uri, config, total, current); } }); layout.addView(photoView); layout.addView(progressBar); container.addView(layout, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); return layout; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } } }