package org.aisen.weibo.sina.ui.fragment.picturepick; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.TextView; import org.aisen.android.common.context.GlobalContext; import org.aisen.android.common.utils.Logger; import org.aisen.android.common.utils.SystemUtils; import org.aisen.android.component.bitmaploader.BitmapLoader; import org.aisen.android.component.bitmaploader.core.ImageConfig; import org.aisen.android.component.bitmaploader.download.SdcardDownloader; import org.aisen.android.network.task.TaskException; import org.aisen.android.support.inject.ViewInject; import org.aisen.android.ui.activity.basic.BaseActivity; import org.aisen.android.ui.activity.container.FragmentArgs; import org.aisen.android.ui.fragment.ABaseFragment; import org.aisen.android.ui.fragment.AGridFragment; import org.aisen.android.ui.fragment.adapter.ARecycleViewItemView; import org.aisen.android.ui.fragment.itemview.IITemView; import org.aisen.android.ui.fragment.itemview.IItemViewCreator; import org.aisen.weibo.sina.R; import org.aisen.weibo.sina.ui.activity.base.SinaCommonActivity; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 图片选择器 * * Created by wangdan on 15-1-29. */ public class PicturePickFragment extends AGridFragment<String, ArrayList<String>> implements AdapterView.OnItemClickListener, PictureDireListFragment.OnPictureDireSelectedCallback { public static void launch(ABaseFragment from, int maxSize, String[] pics, int requestCode) { FragmentArgs args = new FragmentArgs(); args.add("maxSize", maxSize + ""); args.add("pics", pics); SinaCommonActivity.launchForResult(from, PicturePickFragment.class, args, requestCode); } // @ViewInject(id = R.id.btnCounter, click = "savePictures") // View btnCounter; // @ViewInject(id = R.id.txtCounter) // TextView txtCounter; @ViewInject(id = R.id.layCurrent, click = "switchDireListFragment") View layCurrent; @ViewInject(id = R.id.layFileDires) View layFileDires; @ViewInject(id = R.id.layFileDireBg, click = "switchDireListFragment") View layFileDireBg; @ViewInject(id = R.id.txtCurrent) TextView txtCurrent; private int maxSize = 9;// 最大选择多少张图片 private ArrayList<String> selectedFile = new ArrayList<String>();// 已经选中的图片 ImageConfig imageConfig = new ImageConfig(); int gap = GlobalContext.getInstance().getResources().getDimensionPixelSize(R.dimen.gap_photo); private PictureDireListFragment diresFragment; private String selectedDirName; @Override public int inflateContentView() { return R.layout.ui_picture_pick; } @Override protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) { super.layoutInit(inflater, savedInstanceSate); final BaseActivity baseActivity = (BaseActivity) getActivity(); baseActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); baseActivity.getSupportActionBar().setDisplayShowHomeEnabled(false); baseActivity.getSupportActionBar().setTitle(R.string.title_mobile_photos); setHasOptionsMenu(true); maxSize = Integer.parseInt(getArguments().getString("maxSize")); imageConfig.setId("thumb"); imageConfig.setCacheEnable(false); imageConfig.setLoadingRes(R.drawable.bg_timeline_loading); imageConfig.setLoadfaildRes(R.drawable.bg_timeline_loading); imageConfig.setDownloaderClass(SdcardDownloader.class); imageConfig.setMaxWidth(SystemUtils.getScreenWidth(getActivity()) / 4); imageConfig.setMaxHeight(SystemUtils.getScreenWidth(getActivity()) / 4); diresFragment = (PictureDireListFragment) getActivity().getFragmentManager().findFragmentByTag("diresFragment"); if (diresFragment != null) diresFragment.setCallback(this); setHasOptionsMenu(true); selectedDirName = savedInstanceSate == null ? "所有图片" : savedInstanceSate.getString("selectedDirName"); txtCurrent.setText(selectedDirName); getActivity().invalidateOptionsMenu(); // btnCounter.setVisibility(selectedFile.size() == 0 ? View.GONE : View.VISIBLE); // txtCounter.setText(String.format("预览(%d/%d)", selectedFile.size(), maxSize)); if (getArguments() != null) { String[] pics = getArguments().getStringArray("pics"); if (pics != null) { for (String pic : pics) selectedFile.add(pic); } } else if (savedInstanceSate != null) { selectedFile = (ArrayList) savedInstanceSate.getSerializable("selectedFile"); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("selectedDirName", selectedDirName); outState.putSerializable("selectedFile", selectedFile); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String path = getAdapterItems().get(position); // 多选 if (maxSize > 1) { onPictureSelectedChange(path); getActivity().invalidateOptionsMenu(); } // 单选 else { selectedFile.add(path); savePics(); // 设置头像 // PhotoSettingFragment.launch(this, path, 3000); } } @Override public void onPictureDireSelected(PictureDireListFragment.PictureFileDire dire) { selectedDirName = dire.getName(); txtCurrent.setText(selectedDirName); setItems(dire.getFiles()); getRefreshView().smoothScrollToPosition(0); switchDireListFragment(layFileDires); } boolean expandDir = false; void switchDireListFragment(View v) { if (layFileDires.getVisibility() == View.GONE) { layFileDires.setVisibility(View.VISIBLE); } AnimatorSet animSet = new AnimatorSet(); animSet.setDuration(300); PropertyValuesHolder alphaPvh = null; PropertyValuesHolder yPvh = null; // 切换至隐藏 if (layFileDireBg.getAlpha() > 0.0f) { expandDir = false; alphaPvh = PropertyValuesHolder.ofFloat(View.ALPHA, 0.6f, 0.0f); yPvh = PropertyValuesHolder.ofFloat(View.TRANSLATION_Y, 0, getRefreshView().getHeight()); } else { expandDir = true; alphaPvh = PropertyValuesHolder.ofFloat(View.ALPHA, 0.0f, 0.6f); yPvh = PropertyValuesHolder.ofFloat(View.TRANSLATION_Y, getRefreshView().getHeight(), 0); } // 背景视图的动画 ObjectAnimator alphaAnim = ObjectAnimator.ofPropertyValuesHolder(layFileDireBg, alphaPvh); animSet.playTogether(alphaAnim); // 文件夹视图的动画 ObjectAnimator yAnim = ObjectAnimator.ofPropertyValuesHolder(layFileDires, yPvh); animSet.playTogether(yAnim); animSet.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { if (expandDir) layFileDireBg.setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animator animation) { diresFragment.refreshUI(); if (!expandDir) { layFileDireBg.setVisibility(View.GONE); } } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); animSet.start(); } private void onPictureSelectedChange(String path) { if (!selectedFile.contains(path)) { if (selectedFile.size() >= maxSize) { showMessage(String.format("最多只能选%d张相片", maxSize)); return; } selectedFile.add(path); } else selectedFile.remove(path); getAdapter().notifyDataSetChanged(); getActivity().invalidateOptionsMenu(); // btnCounter.setVisibility(selectedFile.size() == 0 ? View.GONE : View.VISIBLE); // txtCounter.setText(String.format("预览(%d/%d)", selectedFile.size(), maxSize)); } @Override public IItemViewCreator<String> configItemViewCreator() { return new IItemViewCreator<String>() { @Override public View newContentView(LayoutInflater inflater, ViewGroup parent, int viewType) { return inflater.inflate(R.layout.item_picture_pick, parent, false); } @Override public IITemView<String> newItemView(View convertView, int viewType) { return new PicturePickItenView(convertView); } }; } @Override public void requestData(RefreshMode mode) { new PicturePickTask().execute(); } void savePictures(View v) { String[] pathArr = new String[selectedFile.size()]; for (int i = 0; i < pathArr.length; i++) pathArr[i] = selectedFile.get(i); // PicsPickPreviousActivity.launch(this, pathArr, 2000); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK && requestCode == 2000) { String[] pics = data.getStringArrayExtra("images"); selectedFile.clear(); for (String pic : pics) { selectedFile.add(pic); } // btnCounter.setVisibility(selectedFile.size() == 0 ? View.GONE : View.VISIBLE); // txtCounter.setText(String.format("预览(%d/%d)", selectedFile.size(), maxSize)); getAdapter().notifyDataSetChanged(); getActivity().invalidateOptionsMenu(); // 如果在预览已经确定了,就直接返回数据 if (data.getBooleanExtra("confirm", false)) { savePics(); } } // 设置头像成功 else if (resultCode == Activity.RESULT_OK && requestCode == 3000) { getActivity().finish(); } } class PicturePickItenView extends ARecycleViewItemView<String> { @ViewInject(id = R.id.img) ImageView img; @ViewInject(id = R.id.viewCover) View cover; @ViewInject(id = R.id.btnCheckbox) View btnCheckbox; public PicturePickItenView(View itemView) { super(getActivity(), itemView); } @Override public void onBindData(View convertView, String data, int position) { BitmapLoader.getInstance().display(PicturePickFragment.this, data, img, imageConfig); // 多选 if (maxSize > 1) { if (selectedFile.contains(data)) { cover.setVisibility(View.VISIBLE); btnCheckbox.setSelected(true); } else { cover.setVisibility(View.GONE); btnCheckbox.setSelected(false); } btnCheckbox.setTag(data); } // 单选 else { cover.setVisibility(View.GONE); btnCheckbox.setVisibility(View.GONE); } int width = (SystemUtils.getScreenWidth(getActivity()) - gap * 2) / 3; convertView.setLayoutParams(new AbsListView.LayoutParams(width, width)); } } class PicturePickTask extends APagingTask<Void, Void, ArrayList<String>> { PicturePickTask() { super(RefreshMode.reset); } @Override protected List<String> parseResult(ArrayList<String> strings) { return strings; } @Override protected ArrayList<String> workInBackground(RefreshMode mode, String previousPage, String nextPage, Void... params) throws TaskException { ArrayList picFileList = new ArrayList<String>(); Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); Uri uri = intent.getData(); String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = GlobalContext.getInstance().getContentResolver().query(uri, proj, null, null, null); while (cursor.moveToNext()) { String path = cursor.getString(0); if (TextUtils.isEmpty(path)) { continue; } Logger.d(path); picFileList.add(new File(path).getAbsolutePath()); } cursor.close(); Collections.reverse(picFileList); return picFileList; } @Override protected void onSuccess(ArrayList<String> strings) { super.onSuccess(strings); if (getActivity() == null) return; ArrayList<PictureDireListFragment.PictureFileDire> files = new ArrayList<PictureDireListFragment.PictureFileDire>(); PictureDireListFragment.PictureFileDire all = new PictureDireListFragment.PictureFileDire(); all.setName("所有图片"); all.setFiles(new ArrayList<String>()); files.add(all); txtCurrent.setText(all.getName()); Map<String, PictureDireListFragment.PictureFileDire> map = new HashMap<String, PictureDireListFragment.PictureFileDire>(); for (String path : strings) { all.getFiles().add(path); File file = new File(path); PictureDireListFragment.PictureFileDire dire = map.get(file.getParentFile().getName()); if (dire == null) { dire = new PictureDireListFragment.PictureFileDire(); dire.setName(file.getParentFile().getName()); dire.setFiles(new ArrayList<String>()); files.add(dire); map.put(file.getParentFile().getName(), dire); } dire.getFiles().add(path); } diresFragment = PictureDireListFragment.newInstance(all.getName(), files); diresFragment.setCallback(PicturePickFragment.this); getActivity().getFragmentManager().beginTransaction().add(R.id.layFileDires, diresFragment, "diresFragment").commit(); } } private void savePics() { Intent data = new Intent(); data.putExtra("pics", selectedFile.toArray(new String[0])); getActivity().setResult(Activity.RESULT_OK, data); getActivity().finish(); } @Override public void onDestroy() { super.onDestroy(); BitmapLoader.getInstance().clearCache(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_picture_pick, menu); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); MenuItem item = menu.findItem(R.id.menu_confirm); item.setVisible(selectedFile.size() > 0); item.setTitle(String.format("完成(%d/%d)", selectedFile.size(), maxSize)); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.menu_confirm) { savePics(); } return super.onOptionsItemSelected(item); } }