package com.photoselector.ui; /** * * @author Aizaz AZ * */ import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.provider.MediaStore; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.CompoundButton; import android.widget.GridView; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator; import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.assist.QueueProcessingType; import com.nostra13.universalimageloader.core.decode.BaseImageDecoder; import com.nostra13.universalimageloader.core.download.BaseImageDownloader; import com.nostra13.universalimageloader.utils.StorageUtils; import com.photoselector.R; import com.photoselector.domain.PhotoSelectorDomain; import com.photoselector.model.AlbumModel; import com.photoselector.model.PhotoModel; import com.photoselector.ui.PhotoItem.onItemClickListener; import com.photoselector.ui.PhotoItem.onPhotoItemCheckedListener; import com.photoselector.util.AnimationUtil; import com.photoselector.util.CommonUtils; /** * @author Aizaz AZ * */ public class PhotoSelectorActivity extends Activity implements onItemClickListener, onPhotoItemCheckedListener, OnItemClickListener, OnClickListener { public static final int SINGLE_IMAGE = 1; public static final String KEY_MAX = "key_max"; private int MAX_IMAGE; public static final int REQUEST_PHOTO = 0; private static final int REQUEST_CAMERA = 1; public static String RECCENT_PHOTO = null; private GridView gvPhotos; private ListView lvAblum; private Button btnOk; private TextView tvAlbum, tvPreview, tvTitle; private PhotoSelectorDomain photoSelectorDomain; private PhotoSelectorAdapter photoAdapter; private AlbumAdapter albumAdapter; private RelativeLayout layoutAlbum; private ArrayList<PhotoModel> selected; private TextView tvNumber; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); RECCENT_PHOTO = getResources().getString(R.string.recent_photos); requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏 setContentView(R.layout.activity_photoselector); if (getIntent().getExtras() != null) { MAX_IMAGE = getIntent().getIntExtra(KEY_MAX, 10); } initImageLoader(); photoSelectorDomain = new PhotoSelectorDomain(getApplicationContext()); selected = new ArrayList<PhotoModel>(); tvTitle = (TextView) findViewById(R.id.tv_title_lh); gvPhotos = (GridView) findViewById(R.id.gv_photos_ar); lvAblum = (ListView) findViewById(R.id.lv_ablum_ar); btnOk = (Button) findViewById(R.id.btn_right_lh); tvAlbum = (TextView) findViewById(R.id.tv_album_ar); tvPreview = (TextView) findViewById(R.id.tv_preview_ar); layoutAlbum = (RelativeLayout) findViewById(R.id.layout_album_ar); tvNumber = (TextView) findViewById(R.id.tv_number); btnOk.setOnClickListener(this); tvAlbum.setOnClickListener(this); tvPreview.setOnClickListener(this); photoAdapter = new PhotoSelectorAdapter(getApplicationContext(), new ArrayList<PhotoModel>(), CommonUtils.getWidthPixels(this), this, this, this); gvPhotos.setAdapter(photoAdapter); albumAdapter = new AlbumAdapter(getApplicationContext(), new ArrayList<AlbumModel>()); lvAblum.setAdapter(albumAdapter); lvAblum.setOnItemClickListener(this); findViewById(R.id.bv_back_lh).setOnClickListener(this); // 返回 photoSelectorDomain.getReccent(reccentListener); // 更新最近照片 photoSelectorDomain.updateAlbum(albumListener); // 跟新相册信息 } private void initImageLoader() { DisplayImageOptions imageOptions = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_picture_loading) .showImageOnFail(R.drawable.ic_picture_loadfailed) .cacheInMemory(true).cacheOnDisk(true) .resetViewBeforeLoading(true).considerExifParams(false) .bitmapConfig(Bitmap.Config.RGB_565).build(); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( this) .memoryCacheExtraOptions(400, 400) // default = device screen dimensions .diskCacheExtraOptions(400, 400, null) .threadPoolSize(5) // default Thread.NORM_PRIORITY - 1 .threadPriority(Thread.NORM_PRIORITY) // default FIFO .tasksProcessingOrder(QueueProcessingType.LIFO) // default .denyCacheImageMultipleSizesInMemory() .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) .memoryCacheSize(2 * 1024 * 1024) .memoryCacheSizePercentage(13) // default .diskCache( new UnlimitedDiscCache(StorageUtils.getCacheDirectory( this, true))) // default .diskCacheSize(50 * 1024 * 1024).diskCacheFileCount(100) .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default .imageDownloader(new BaseImageDownloader(this)) // default .imageDecoder(new BaseImageDecoder(false)) // default .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default .defaultDisplayImageOptions(imageOptions).build(); ImageLoader.getInstance().init(config); } @Override public void onClick(View v) { if (v.getId() == R.id.btn_right_lh) ok(); // 选完照片 else if (v.getId() == R.id.tv_album_ar) album(); else if (v.getId() == R.id.tv_preview_ar) priview(); else if (v.getId() == R.id.tv_camera_vc) catchPicture(); else if (v.getId() == R.id.bv_back_lh) finish(); } /** 拍照 */ private void catchPicture() { CommonUtils.launchActivityForResult(this, new Intent( MediaStore.ACTION_IMAGE_CAPTURE), REQUEST_CAMERA); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CAMERA && resultCode == RESULT_OK) { PhotoModel photoModel = new PhotoModel(CommonUtils.query( getApplicationContext(), data.getData())); // selected.clear(); // //--keep all // selected photos // tvNumber.setText("(0)"); // //--keep all // selected photos // /////////////////////////////////////////////////////////////////////////////////////////// if (selected.size() >= MAX_IMAGE) { Toast.makeText( this, String.format( getString(R.string.max_img_limit_reached), MAX_IMAGE), Toast.LENGTH_SHORT).show(); photoModel.setChecked(false); photoAdapter.notifyDataSetChanged(); } else { if (!selected.contains(photoModel)) { selected.add(photoModel); } } ok(); } } /** 完成 */ private void ok() { if (selected.isEmpty()) { setResult(RESULT_CANCELED); } else { Intent data = new Intent(); Bundle bundle = new Bundle(); bundle.putSerializable("photos", selected); data.putExtras(bundle); setResult(RESULT_OK, data); } finish(); } /** 预览照片 */ private void priview() { Bundle bundle = new Bundle(); bundle.putSerializable("photos", selected); CommonUtils.launchActivity(this, PhotoPreviewActivity.class, bundle); } private void album() { if (layoutAlbum.getVisibility() == View.GONE) { popAlbum(); } else { hideAlbum(); } } /** 弹出相册列表 */ private void popAlbum() { layoutAlbum.setVisibility(View.VISIBLE); new AnimationUtil(getApplicationContext(), R.anim.translate_up_current) .setLinearInterpolator().startAnimation(layoutAlbum); } /** 隐藏相册列表 */ private void hideAlbum() { new AnimationUtil(getApplicationContext(), R.anim.translate_down) .setLinearInterpolator().startAnimation(layoutAlbum); layoutAlbum.setVisibility(View.GONE); } /** 清空选中的图片 */ private void reset() { selected.clear(); tvNumber.setText("(0)"); tvPreview.setEnabled(false); } @Override /** 点击查看照片 */ public void onItemClick(int position) { Bundle bundle = new Bundle(); if (tvAlbum.getText().toString().equals(RECCENT_PHOTO)) bundle.putInt("position", position - 1); else bundle.putInt("position", position); bundle.putString("album", tvAlbum.getText().toString()); CommonUtils.launchActivity(this, PhotoPreviewActivity.class, bundle); } @Override /** 照片选中状态改变之后 */ public void onCheckedChanged(PhotoModel photoModel, CompoundButton buttonView, boolean isChecked) { if (isChecked) { if (!selected.contains(photoModel)) selected.add(photoModel); tvPreview.setEnabled(true); } else { selected.remove(photoModel); } tvNumber.setText("(" + selected.size() + ")"); if (selected.isEmpty()) { tvPreview.setEnabled(false); tvPreview.setText(getString(R.string.preview)); } } @Override public void onBackPressed() { if (layoutAlbum.getVisibility() == View.VISIBLE) { hideAlbum(); } else super.onBackPressed(); } @Override /** 相册列表点击事件 */ public void onItemClick(AdapterView<?> parent, View view, int position, long id) { AlbumModel current = (AlbumModel) parent.getItemAtPosition(position); for (int i = 0; i < parent.getCount(); i++) { AlbumModel album = (AlbumModel) parent.getItemAtPosition(i); if (i == position) album.setCheck(true); else album.setCheck(false); } albumAdapter.notifyDataSetChanged(); hideAlbum(); tvAlbum.setText(current.getName()); // tvTitle.setText(current.getName()); // 更新照片列表 if (current.getName().equals(RECCENT_PHOTO)) photoSelectorDomain.getReccent(reccentListener); else photoSelectorDomain.getAlbum(current.getName(), reccentListener); // 获取选中相册的照片 } /** 获取本地图库照片回调 */ public interface OnLocalReccentListener { public void onPhotoLoaded(List<PhotoModel> photos); } /** 获取本地相册信息回调 */ public interface OnLocalAlbumListener { public void onAlbumLoaded(List<AlbumModel> albums); } private OnLocalAlbumListener albumListener = new OnLocalAlbumListener() { @Override public void onAlbumLoaded(List<AlbumModel> albums) { albumAdapter.update(albums); } }; private OnLocalReccentListener reccentListener = new OnLocalReccentListener() { @Override public void onPhotoLoaded(List<PhotoModel> photos) { for (PhotoModel model : photos) { if (selected.contains(model)) { model.setChecked(true); } } photoAdapter.update(photos); gvPhotos.smoothScrollToPosition(0); // 滚动到顶端 // reset(); //--keep selected photos } }; }