/** * Copyright 2016 bingoogolapple * <p/> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package cn.bingoogolapple.photopicker.activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPropertyAnimatorListenerAdapter; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.animation.DecelerateInterpolator; import android.widget.RelativeLayout; import android.widget.TextView; import java.util.ArrayList; import cn.bingoogolapple.androidcommon.adapter.BGAOnNoDoubleClickListener; import cn.bingoogolapple.photopicker.R; import cn.bingoogolapple.photopicker.adapter.BGAPhotoPageAdapter; import cn.bingoogolapple.photopicker.util.BGAPhotoPickerUtil; import cn.bingoogolapple.photopicker.widget.BGAHackyViewPager; import uk.co.senab.photoview.PhotoViewAttacher; /** * 作者:王浩 邮件:bingoogolapple@gmail.com * 创建时间:16/6/24 下午2:57 * 描述:图片选择预览界面 */ public class BGAPhotoPickerPreviewActivity extends BGAPPToolbarActivity implements PhotoViewAttacher.OnViewTapListener { private static final String EXTRA_PREVIEW_IMAGES = "EXTRA_PREVIEW_IMAGES"; private static final String EXTRA_SELECTED_IMAGES = "EXTRA_SELECTED_IMAGES"; private static final String EXTRA_MAX_CHOOSE_COUNT = "EXTRA_MAX_CHOOSE_COUNT"; private static final String EXTRA_CURRENT_POSITION = "EXTRA_CURRENT_POSITION"; private static final String EXTRA_IS_FROM_TAKE_PHOTO = "EXTRA_IS_FROM_TAKE_PHOTO"; private TextView mTitleTv; private TextView mSubmitTv; private BGAHackyViewPager mContentHvp; private RelativeLayout mChooseRl; private TextView mChooseTv; private ArrayList<String> mSelectedImages; private BGAPhotoPageAdapter mPhotoPageAdapter; private int mMaxChooseCount = 1; /** * 右上角按钮文本 */ private String mTopRightBtnText; private boolean mIsHidden = false; /** * 上一次标题栏显示或隐藏的时间戳 */ private long mLastShowHiddenTime; /** * 是否是拍完照后跳转过来 */ private boolean mIsFromTakePhoto; /** * @param context 应用程序上下文 * @param maxChooseCount 图片选择张数的最大值 * @param selectedImages 当前已选中的图片路径集合,可以传null * @param previewImages 当前预览的图片目录里的图片路径集合 * @param currentPosition 当前预览图片的位置 * @param isFromTakePhoto 是否是拍完照后跳转过来 * @return */ public static Intent newIntent(Context context, int maxChooseCount, ArrayList<String> selectedImages, ArrayList<String> previewImages, int currentPosition, boolean isFromTakePhoto) { Intent intent = new Intent(context, BGAPhotoPickerPreviewActivity.class); intent.putStringArrayListExtra(EXTRA_SELECTED_IMAGES, selectedImages); intent.putStringArrayListExtra(EXTRA_PREVIEW_IMAGES, previewImages); intent.putExtra(EXTRA_MAX_CHOOSE_COUNT, maxChooseCount); intent.putExtra(EXTRA_CURRENT_POSITION, currentPosition); intent.putExtra(EXTRA_IS_FROM_TAKE_PHOTO, isFromTakePhoto); return intent; } /** * 获取已选择的图片集合 * * @param intent * @return */ public static ArrayList<String> getSelectedImages(Intent intent) { return intent.getStringArrayListExtra(EXTRA_SELECTED_IMAGES); } /** * 是否是拍照预览 * * @param intent * @return */ public static boolean getIsFromTakePhoto(Intent intent) { return intent.getBooleanExtra(EXTRA_IS_FROM_TAKE_PHOTO, false); } @Override protected void initView(Bundle savedInstanceState) { setNoLinearContentView(R.layout.bga_pp_activity_photo_picker_preview); mContentHvp = getViewById(R.id.hvp_photo_picker_preview_content); mChooseRl = getViewById(R.id.rl_photo_picker_preview_choose); mChooseTv = getViewById(R.id.tv_photo_picker_preview_choose); } @Override protected void setListener() { mChooseTv.setOnClickListener(new BGAOnNoDoubleClickListener() { @Override public void onNoDoubleClick(View v) { String currentImage = mPhotoPageAdapter.getItem(mContentHvp.getCurrentItem()); if (mSelectedImages.contains(currentImage)) { mSelectedImages.remove(currentImage); mChooseTv.setCompoundDrawablesWithIntrinsicBounds(R.mipmap.bga_pp_ic_cb_normal, 0, 0, 0); renderTopRightBtn(); } else { if (mMaxChooseCount == 1) { // 单选 mSelectedImages.clear(); mSelectedImages.add(currentImage); mChooseTv.setCompoundDrawablesWithIntrinsicBounds(R.mipmap.bga_pp_ic_cb_checked, 0, 0, 0); renderTopRightBtn(); } else { // 多选 if (mMaxChooseCount == mSelectedImages.size()) { BGAPhotoPickerUtil.show(getString(R.string.bga_pp_toast_photo_picker_max, mMaxChooseCount)); } else { mSelectedImages.add(currentImage); mChooseTv.setCompoundDrawablesWithIntrinsicBounds(R.mipmap.bga_pp_ic_cb_checked, 0, 0, 0); renderTopRightBtn(); } } } } }); mContentHvp.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { handlePageSelectedStatus(); } }); } @Override protected void processLogic(Bundle savedInstanceState) { // 获取图片选择的最大张数 mMaxChooseCount = getIntent().getIntExtra(EXTRA_MAX_CHOOSE_COUNT, 1); if (mMaxChooseCount < 1) { mMaxChooseCount = 1; } mSelectedImages = getIntent().getStringArrayListExtra(EXTRA_SELECTED_IMAGES); ArrayList<String> previewImages = getIntent().getStringArrayListExtra(EXTRA_PREVIEW_IMAGES); if (TextUtils.isEmpty(previewImages.get(0))) { // 从BGAPhotoPickerActivity跳转过来时,如果有开启拍照功能,则第0项为"" previewImages.remove(0); } // 处理是否是拍完照后跳转过来 mIsFromTakePhoto = getIntent().getBooleanExtra(EXTRA_IS_FROM_TAKE_PHOTO, false); if (mIsFromTakePhoto) { // 如果是拍完照后跳转过来,一直隐藏底部选择栏 mChooseRl.setVisibility(View.INVISIBLE); } int currentPosition = getIntent().getIntExtra(EXTRA_CURRENT_POSITION, 0); // 获取右上角按钮文本 mTopRightBtnText = getString(R.string.bga_pp_confirm); mPhotoPageAdapter = new BGAPhotoPageAdapter(this, this, previewImages); mContentHvp.setAdapter(mPhotoPageAdapter); mContentHvp.setCurrentItem(currentPosition); // 过2秒隐藏标题栏和底部选择栏 mToolbar.postDelayed(new Runnable() { @Override public void run() { hiddenToolBarAndChooseBar(); } }, 2000); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.bga_pp_menu_photo_picker_preview, menu); MenuItem menuItem = menu.findItem(R.id.item_photo_picker_preview_title); View actionView = menuItem.getActionView(); mTitleTv = (TextView) actionView.findViewById(R.id.tv_photo_picker_preview_title); mSubmitTv = (TextView) actionView.findViewById(R.id.tv_photo_picker_preview_submit); mSubmitTv.setOnClickListener(new BGAOnNoDoubleClickListener() { @Override public void onNoDoubleClick(View v) { Intent intent = new Intent(); intent.putStringArrayListExtra(EXTRA_SELECTED_IMAGES, mSelectedImages); intent.putExtra(EXTRA_IS_FROM_TAKE_PHOTO, mIsFromTakePhoto); setResult(RESULT_OK, intent); finish(); } }); renderTopRightBtn(); handlePageSelectedStatus(); return true; } @Override public void onBackPressed() { Intent intent = new Intent(); intent.putStringArrayListExtra(EXTRA_SELECTED_IMAGES, mSelectedImages); intent.putExtra(EXTRA_IS_FROM_TAKE_PHOTO, mIsFromTakePhoto); setResult(RESULT_CANCELED, intent); finish(); } private void handlePageSelectedStatus() { if (mTitleTv == null || mPhotoPageAdapter == null) { return; } mTitleTv.setText((mContentHvp.getCurrentItem() + 1) + "/" + mPhotoPageAdapter.getCount()); if (mSelectedImages.contains(mPhotoPageAdapter.getItem(mContentHvp.getCurrentItem()))) { mChooseTv.setCompoundDrawablesWithIntrinsicBounds(R.mipmap.bga_pp_ic_cb_checked, 0, 0, 0); } else { mChooseTv.setCompoundDrawablesWithIntrinsicBounds(R.mipmap.bga_pp_ic_cb_normal, 0, 0, 0); } } /** * 渲染右上角按钮 */ private void renderTopRightBtn() { if (mIsFromTakePhoto) { mSubmitTv.setEnabled(true); mSubmitTv.setText(mTopRightBtnText); } else if (mSelectedImages.size() == 0) { mSubmitTv.setEnabled(false); mSubmitTv.setText(mTopRightBtnText); } else { mSubmitTv.setEnabled(true); mSubmitTv.setText(mTopRightBtnText + "(" + mSelectedImages.size() + "/" + mMaxChooseCount + ")"); } } @Override public void onViewTap(View view, float x, float y) { if (System.currentTimeMillis() - mLastShowHiddenTime > 500) { mLastShowHiddenTime = System.currentTimeMillis(); if (mIsHidden) { showTitleBarAndChooseBar(); } else { hiddenToolBarAndChooseBar(); } } } private void showTitleBarAndChooseBar() { if (mToolbar != null) { ViewCompat.animate(mToolbar).translationY(0).setInterpolator(new DecelerateInterpolator(2)).setListener(new ViewPropertyAnimatorListenerAdapter() { @Override public void onAnimationEnd(View view) { mIsHidden = false; } }).start(); } if (!mIsFromTakePhoto && mChooseRl != null) { mChooseRl.setVisibility(View.VISIBLE); ViewCompat.setAlpha(mChooseRl, 0); ViewCompat.animate(mChooseRl).alpha(1).setInterpolator(new DecelerateInterpolator(2)).start(); } } private void hiddenToolBarAndChooseBar() { if (mToolbar != null) { ViewCompat.animate(mToolbar).translationY(-mToolbar.getHeight()).setInterpolator(new DecelerateInterpolator(2)).setListener(new ViewPropertyAnimatorListenerAdapter() { @Override public void onAnimationEnd(View view) { mIsHidden = true; if (mChooseRl != null) { mChooseRl.setVisibility(View.INVISIBLE); } } }).start(); } if (!mIsFromTakePhoto) { if (mChooseRl != null) { ViewCompat.animate(mChooseRl).alpha(0).setInterpolator(new DecelerateInterpolator(2)).start(); } } } }