package com.umeng.comm.ui.imagepicker; import android.app.Activity; import android.content.Intent; import android.os.Bundle; 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.GridView; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.umeng.comm.core.constants.Constants; import com.umeng.comm.core.sdkmanager.ImageLoaderManager; import com.umeng.comm.core.utils.ResFinder; import com.umeng.comm.core.utils.ResFinder.ResType; import com.umeng.comm.core.utils.ToastMsg; import com.umeng.comm.ui.imagepicker.adapters.AlbumAdapter; import com.umeng.comm.ui.imagepicker.adapters.PhotoAdapter; import com.umeng.comm.ui.imagepicker.domain.PhotoSelectorDomain; import com.umeng.comm.ui.imagepicker.model.AlbumModel; import com.umeng.comm.ui.imagepicker.model.PhotoConstants; import com.umeng.comm.ui.imagepicker.model.PhotoModel; import com.umeng.comm.ui.imagepicker.util.AnimationUtil; import com.umeng.comm.ui.imagepicker.util.ImagePickerUtils; import com.umeng.comm.ui.imagepicker.widgets.PhotoItemViewHolder; import com.umeng.comm.ui.imagepicker.widgets.PhotoItemViewHolder.onItemClickListener; import com.umeng.comm.ui.imagepicker.widgets.PhotoItemViewHolder.onPhotoItemCheckedListener; import java.util.ArrayList; import java.util.List; /** * 图片选择Activity */ 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"; public static final String SELECTED = "selected"; public static final String ADD_PHOTO_PATH = "add_image_path_sample"; 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 mPhotosGridView; private ListView mAblumListView; private Button btnOk; private TextView tvAlbum, tvPreview; private PhotoSelectorDomain photoSelectorDomain; private PhotoAdapter mPhotoAdapter; private AlbumAdapter albumAdapter; private RelativeLayout layoutAlbum; private ArrayList<PhotoModel> mSelectedPhotos; private TextView tvNumber; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); RECCENT_PHOTO = ResFinder.getString("umeng_comm_recent_photos"); requestWindowFeature(Window.FEATURE_NO_TITLE);// setContentView(ResFinder.getLayout("umeng_comm_imagepicker_photoselector")); parseIntentExtra(getIntent()); initWidgets(); initPhotoGridView(); initAlbumListView(); photoSelectorDomain = new PhotoSelectorDomain(getApplicationContext()); photoSelectorDomain.getReccent(reccentListener); photoSelectorDomain.updateAlbum(albumListener); } private void initWidgets() { // tvTitle = (TextView) // findViewById(ResFinder.getId("umeng_comm_tv_title_lh")); mPhotosGridView = (GridView) findViewById(ResFinder.getId("umeng_comm_gv_photos_ar")); mAblumListView = (ListView) findViewById(ResFinder.getId("umeng_comm_lv_ablum_ar")); btnOk = (Button) findViewById(ResFinder.getId("umeng_comm_btn_right_lh")); tvAlbum = (TextView) findViewById(ResFinder.getId("umeng_comm_tv_album_ar")); tvPreview = (TextView) findViewById(ResFinder.getId("umeng_comm_tv_preview_ar")); layoutAlbum = (RelativeLayout) findViewById(ResFinder.getId("umeng_comm_layout_album_ar")); tvNumber = (TextView) findViewById(ResFinder.getId("umeng_comm_tv_number")); updateSelectePhotoSize(); btnOk.setOnClickListener(this); tvAlbum.setOnClickListener(this); tvPreview.setOnClickListener(this); findViewById(ResFinder.getId("umeng_comm_bv_back_lh")).setOnClickListener(this); // 返回按钮 } private void initPhotoGridView() { mPhotoAdapter = new PhotoAdapter(getApplicationContext(), new ArrayList<PhotoModel>(), ImagePickerUtils.getWidthPixels(this), this, this); mPhotosGridView.setAdapter(mPhotoAdapter); } private void initAlbumListView() { albumAdapter = new AlbumAdapter(getApplicationContext(), new ArrayList<AlbumModel>()); mAblumListView.setAdapter(albumAdapter); mAblumListView.setOnItemClickListener(this); } private void parseIntentExtra(Intent intent) { if (getIntent().getExtras() != null) { MAX_IMAGE = getIntent().getIntExtra(KEY_MAX, 9); // 初始化mSelectedPhotos mSelectedPhotos = new ArrayList<PhotoModel>(); // 获取从外部传递进来的已选列表 initSelectedPhotoModels(intent.getStringArrayListExtra(Constants.PICKED_IMAGES)); } else { // 选中的图片 mSelectedPhotos = new ArrayList<PhotoModel>(); } } private void initSelectedPhotoModels(List<String> selectedList) { if (selectedList != null) { for (String path : selectedList) { if (!path.equals(ADD_PHOTO_PATH)) { mSelectedPhotos.add(new PhotoModel(path, true)); } } } } @Override public void onClick(View v) { if (v.getId() == ResFinder.getId("umeng_comm_btn_right_lh")) pickedImageDone(); else if (v.getId() == ResFinder.getId("umeng_comm_tv_album_ar")) album(); else if (v.getId() == ResFinder.getId("umeng_comm_tv_preview_ar")) preview(); else if (v.getId() == ResFinder.getId("umeng_comm_bv_back_lh")) finish(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CAMERA && resultCode == RESULT_OK) { PhotoModel photoModel = new PhotoModel(ImagePickerUtils.query( getApplicationContext(), data.getData())); // /////////////////////////////////////////////////////////////////////////////////////////// if (mSelectedPhotos.size() >= MAX_IMAGE) { String toastMsg = String.format( ResFinder.getString("umeng_comm_max_img_limit_reached"), MAX_IMAGE); Toast.makeText( this, toastMsg, Toast.LENGTH_SHORT).show(); photoModel.setChecked(false); mPhotoAdapter.notifyDataSetChanged(); } else { if (!mSelectedPhotos.contains(photoModel)) { mSelectedPhotos.add(photoModel); } } pickedImageDone(); } } private void pickedImageDone() { if (mSelectedPhotos.isEmpty()) { setResult(RESULT_CANCELED); } else { Intent data = new Intent(); Bundle bundle = new Bundle(); bundle.putSerializable(Constants.FEED_IMAGES, mSelectedPhotos); data.putExtras(bundle); setResult(RESULT_OK, data); } finish(); } private void preview() { Bundle bundle = new Bundle(); bundle.putSerializable(PhotoConstants.PHOTO_PRVIEW_PHOTO, mSelectedPhotos); ImagePickerUtils.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(), ResFinder.getResourceId(ResType.ANIM, "umeng_comm_translate_up_current")) .setLinearInterpolator().startAnimation(layoutAlbum); } private void hideAlbum() { new AnimationUtil(getApplicationContext(), ResFinder.getResourceId(ResType.ANIM, "umeng_comm_translate_down")) .setLinearInterpolator().startAnimation(layoutAlbum); layoutAlbum.setVisibility(View.GONE); } /** 点击查看照片 */ @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.putInt("position", position); bundle.putString("album", tvAlbum.getText().toString()); ImagePickerUtils.launchActivity(this, PhotoPreviewActivity.class, bundle); } @Override public void onCheckedChanged(PhotoItemViewHolder photoItem, PhotoModel photoModel, boolean isChecked) { // 不能超过最大数量 if (mSelectedPhotos.size() == MAX_IMAGE && isChecked) { ToastMsg.showShortMsgByResName("umeng_comm_image_overflow"); photoItem.updatePhotoItemState(false); return; } if (isChecked) { if (!mSelectedPhotos.contains(photoModel)) { mSelectedPhotos.add(photoModel); } tvPreview.setEnabled(true); } else { mSelectedPhotos.remove(photoModel); } // 更新选中状态 photoItem.updatePhotoItemState(isChecked); updateSelectePhotoSize(); if (mSelectedPhotos.isEmpty()) { tvPreview.setEnabled(false); tvPreview.setText(ResFinder.getString("umeng_comm_preview")); } } private void updateSelectePhotoSize() { tvNumber.setText("(" + mSelectedPhotos.size() + ")"); } @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()); if (current.getName().equals(RECCENT_PHOTO)) { photoSelectorDomain.getReccent(reccentListener); } else { photoSelectorDomain.getAlbum(current.getName(), reccentListener); // 获取选中相册的照片 } } 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 (mSelectedPhotos.contains(model)) { model.setChecked(true); } } mPhotoAdapter.update(photos); mPhotosGridView.setSelection(0); // 修改图片选择目录之后滚动到顶部 } }; /** 获取本地图库照片回调 */ public static interface OnLocalReccentListener { public void onPhotoLoaded(List<PhotoModel> photos); } /** 获取本地相册信息回调 */ public static interface OnLocalAlbumListener { public void onAlbumLoaded(List<AlbumModel> albums); } @Override protected void onResume() { super.onResume(); ImageLoaderManager.getInstance().getCurrentSDK().reset(); ImageLoaderManager.getInstance().getCurrentSDK().resume(); } @Override protected void onStop() { super.onStop(); ImageLoaderManager.getInstance().getCurrentSDK().reset(); } }