package com.luck.picture.lib.ui; import android.media.AudioManager; import android.media.SoundPool; import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; import android.view.animation.Animation; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.luck.picture.lib.R; import com.luck.picture.lib.model.FunctionConfig; import com.luck.picture.lib.observable.ImagesObservable; import com.luck.picture.lib.widget.PreviewViewPager; import com.yalantis.ucrop.MultiUCrop; import com.yalantis.ucrop.dialog.OptAnimationLoader; import com.yalantis.ucrop.dialog.SweetAlertDialog; import com.yalantis.ucrop.entity.EventEntity; import com.yalantis.ucrop.entity.LocalMedia; import com.yalantis.ucrop.rxbus2.RxBus; import com.yalantis.ucrop.rxbus2.Subscribe; import com.yalantis.ucrop.rxbus2.ThreadMode; import com.yalantis.ucrop.util.LightStatusBarUtils; import com.yalantis.ucrop.util.ToolbarUtil; import java.io.File; import java.util.ArrayList; import java.util.List; /** * author:luck * project:PictureSelector * package:com.luck.picture.ui * email:893855882@qq.com * data:16/12/31 */ public class PicturePreviewActivity extends PictureBaseActivity implements View.OnClickListener, Animation.AnimationListener { private ImageView picture_left_back; private TextView tv_img_num, tv_title, tv_ok; private RelativeLayout select_bar_layout; private PreviewViewPager viewPager; private int position; private RelativeLayout rl_title; private LinearLayout ll_check; private List<LocalMedia> images = new ArrayList<>(); private List<LocalMedia> selectImages = new ArrayList<>(); private TextView check; private SimpleFragmentAdapter adapter; private Animation animation; private boolean refresh; private SweetAlertDialog dialog; private SoundPool soundPool;//声明一个SoundPool private int soundID;//创建某个声音对应的音频ID //EventBus 3.0 回调 @Subscribe(threadMode = ThreadMode.MAIN) public void eventBus(EventEntity obj) { switch (obj.what) { case FunctionConfig.CLOSE_FLAG: dismiss(); closeActivity(); break; case FunctionConfig.CLOSE_PREVIEW_FLAG: closeActivity(); break; } } // 关闭activity protected void closeActivity() { finish(); overridePendingTransition(0, R.anim.slide_bottom_out); } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.picture_activity_image_preview); if (!RxBus.getDefault().isRegistered(this)) { RxBus.getDefault().register(this); } if (isImmersive) { LightStatusBarUtils.setLightStatusBar(this, false); } if (clickVideo) { if (soundPool == null) { soundPool = new SoundPool(1, AudioManager.STREAM_ALARM, 0); soundID = soundPool.load(mContext, R.raw.music, 1); } } rl_title = (RelativeLayout) findViewById(R.id.rl_title); picture_left_back = (ImageView) findViewById(R.id.picture_left_back); viewPager = (PreviewViewPager) findViewById(R.id.preview_pager); ll_check = (LinearLayout) findViewById(R.id.ll_check); select_bar_layout = (RelativeLayout) findViewById(R.id.select_bar_layout); check = (TextView) findViewById(R.id.check); picture_left_back.setOnClickListener(this); tv_ok = (TextView) findViewById(R.id.tv_ok); tv_img_num = (TextView) findViewById(R.id.tv_img_num); tv_title = (TextView) findViewById(R.id.picture_title); tv_ok.setOnClickListener(this); position = getIntent().getIntExtra(FunctionConfig.EXTRA_POSITION, 0); tv_ok.setTextColor(completeColor); if (isNumComplete) { tv_ok.setText(getString(R.string.picture_done)); } else { tv_ok.setText(getString(R.string.picture_please_select)); } select_bar_layout.setBackgroundColor(previewBottomBgColor); rl_title.setBackgroundColor(previewTopBgColor); ToolbarUtil.setColorNoTranslucent(this, previewTopBgColor); animation = OptAnimationLoader.loadAnimation(this, R.anim.modal_in); animation.setAnimationListener(this); boolean is_bottom_preview = getIntent().getBooleanExtra(FunctionConfig.EXTRA_BOTTOM_PREVIEW, false); if (is_bottom_preview) { // 底部预览按钮过来 images = (List<LocalMedia>) getIntent().getSerializableExtra(FunctionConfig.EXTRA_PREVIEW_LIST); } else { images = ImagesObservable.getInstance().readLocalMedias(); } if (is_checked_num) { tv_img_num.setBackgroundResource(cb_drawable); tv_img_num.setSelected(true); } selectImages = (List<LocalMedia>) getIntent().getSerializableExtra(FunctionConfig.EXTRA_PREVIEW_SELECT_LIST); initViewPageAdapterData(); ll_check.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 刷新图片列表中图片状态 boolean isChecked; if (!check.isSelected()) { isChecked = true; check.setSelected(true); check.startAnimation(animation); } else { isChecked = false; check.setSelected(false); } if (selectImages.size() >= maxSelectNum && isChecked) { Toast.makeText(PicturePreviewActivity.this, getString(R.string.picture_message_max_num, maxSelectNum), Toast.LENGTH_LONG).show(); check.setSelected(false); return; } LocalMedia image = images.get(viewPager.getCurrentItem()); if (isChecked) { playSound(); selectImages.add(image); image.setNum(selectImages.size()); if (is_checked_num) { check.setText(image.getNum() + ""); } } else { for (LocalMedia media : selectImages) { if (media.getPath().equals(image.getPath())) { selectImages.remove(media); subSelectPosition(); notifyCheckChanged(media); break; } } } onSelectNumChange(true); } }); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { tv_title.setText(position + 1 + "/" + images.size()); if (is_checked_num) { LocalMedia media = images.get(position); check.setText(media.getNum() + ""); notifyCheckChanged(media); } onImageChecked(position); } @Override public void onPageScrollStateChanged(int state) { } }); } private void initViewPageAdapterData() { tv_title.setText(position + 1 + "/" + images.size()); adapter = new SimpleFragmentAdapter(getSupportFragmentManager()); check.setBackgroundResource(cb_drawable); viewPager.setAdapter(adapter); viewPager.setCurrentItem(position); onSelectNumChange(false); onImageChecked(position); if (is_checked_num) { tv_img_num.setBackgroundResource(cb_drawable); tv_img_num.setSelected(true); LocalMedia media = images.get(position); check.setText(media.getNum() + ""); notifyCheckChanged(media); } } /** * 选择按钮更新 */ private void notifyCheckChanged(LocalMedia imageBean) { if (is_checked_num) { check.setText(""); for (LocalMedia media : selectImages) { if (media.getPath().equals(imageBean.getPath())) { imageBean.setNum(media.getNum()); check.setText(String.valueOf(imageBean.getNum())); } } } } /** * 更新选择的顺序 */ private void subSelectPosition() { for (int index = 0, len = selectImages.size(); index < len; index++) { LocalMedia media = selectImages.get(index); media.setNum(index + 1); } } /** * 判断当前图片是否选中 * * @param position */ public void onImageChecked(int position) { if (images != null && images.size() > 0) { check.setSelected(isSelected(images.get(position))); } else { check.setSelected(false); } } /** * 当前图片是否选中 * * @param image * @return */ public boolean isSelected(LocalMedia image) { for (LocalMedia media : selectImages) { if (media.getPath().equals(image.getPath())) { return true; } } return false; } /** * 更新图片选择数量 */ public void onSelectNumChange(boolean isRefresh) { this.refresh = isRefresh; boolean enable = selectImages.size() != 0; if (enable) { tv_ok.setEnabled(true); if (isNumComplete) { tv_ok.setText(getString(R.string.picture_done_front_num, selectImages.size(), maxSelectNum)); } else { tv_img_num.startAnimation(animation); tv_img_num.setVisibility(View.VISIBLE); tv_img_num.setText(selectImages.size() + ""); tv_ok.setText(getString(R.string.picture_completed)); } } else { tv_ok.setEnabled(false); if (isNumComplete) { tv_ok.setText(getString(R.string.picture_done)); } else { tv_img_num.setVisibility(View.INVISIBLE); tv_ok.setText(getString(R.string.picture_please_select)); } updateSelector(refresh); } } /** * 更新图片列表选中效果 * * @param isRefresh */ private void updateSelector(boolean isRefresh) { if (isRefresh) { EventEntity obj = new EventEntity(FunctionConfig.UPDATE_FLAG, selectImages); RxBus.getDefault().post(obj); } } @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { updateSelector(refresh); } @Override public void onAnimationRepeat(Animation animation) { } public class SimpleFragmentAdapter extends FragmentPagerAdapter { public SimpleFragmentAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { PictureImagePreviewFragment fragment = PictureImagePreviewFragment.getInstance(images.get(position).getPath(), true, "", selectImages); return fragment; } @Override public int getCount() { return images.size(); } } @Override public void onClick(View view) { int id = view.getId(); if (id == R.id.picture_left_back) { finish(); } else if (id == R.id.tv_ok) { // 如果设置了图片最小选择数量,则判断是否满足条件 int size = selectImages.size(); if (minSelectNum > 0) { if (size < minSelectNum && selectMode == FunctionConfig.MODE_MULTIPLE) { switch (type) { case FunctionConfig.TYPE_IMAGE: showToast(getString(R.string.picture_min_img_num, options.getMinSelectNum())); return; case FunctionConfig.TYPE_VIDEO: showToast(getString(R.string.picture_min_video_num, options.getMinSelectNum())); return; default: break; } } } if (selectMode == FunctionConfig.MODE_MULTIPLE && enableCrop && type == FunctionConfig.TYPE_IMAGE) { // 是图片和选择压缩并且是多张,调用批量压缩 startMultiCrop(selectImages); } else { onResult(selectImages); } } } public void onResult(List<LocalMedia> images) { // 因为这里是单一实例的结果集,重新用变量接收一下在返回,不然会产生结果集被单一实例清空的问题 List<LocalMedia> result = new ArrayList<>(); for (LocalMedia media : images) { result.add(media); } EventEntity obj = new EventEntity(FunctionConfig.CROP_FLAG, result); RxBus.getDefault().post(obj); // 如果开启了压缩,先不关闭此页面,PictureImageGridActivity压缩完在通知关闭 if (!isCompress) { finish(); overridePendingTransition(0, R.anim.slide_bottom_out); } else { showPleaseDialog(getString(R.string.picture_please)); } } /** * 多图裁剪 * * @param medias */ protected void startMultiCrop(List<LocalMedia> medias) { if (medias != null && medias.size() > 0) { LocalMedia media = medias.get(0); String path = media.getPath(); // 去裁剪 MultiUCrop uCrop = MultiUCrop.of(Uri.parse(path), Uri.fromFile(new File(getCacheDir(), System.currentTimeMillis() + ".jpg"))); MultiUCrop.Options options = new MultiUCrop.Options(); if (offsetX > 0 && offsetY > 0) { options.withAspectRatio(offsetX, offsetY); } else { switch (copyMode) { case FunctionConfig.CROP_MODEL_DEFAULT: options.withAspectRatio(0, 0); break; case FunctionConfig.CROP_MODEL_1_1: options.withAspectRatio(1, 1); break; case FunctionConfig.CROP_MODEL_3_2: options.withAspectRatio(3, 2); break; case FunctionConfig.CROP_MODEL_3_4: options.withAspectRatio(3, 4); break; case FunctionConfig.CROP_MODEL_16_9: options.withAspectRatio(16, 9); break; } } // 圆形裁剪 if (circularCut) { options.setCircleDimmedLayer(true);// 是否为椭圆 options.setShowCropFrame(false);// 外部矩形 options.setShowCropGrid(false);// 内部网格 options.withAspectRatio(1, 1); } options.setLocalMedia(medias); options.setFreeStyleCropEnabled(freeStyleCrop); options.setCompressionQuality(compressQuality); options.withMaxResultSize(cropW, cropH); options.background_color(backgroundColor); options.setIsCompress(isCompress); options.copyMode(copyMode); options.setLeftBackDrawable(leftDrawable); options.setCircularCut(circularCut); options.setTitleColor(title_color); options.setRightColor(right_color); options.setStatusBar(statusBar); options.setImmersiver(isImmersive); options.setRotateEnabled(rotateEnabled); options.setScaleEnabled(scaleEnabled); uCrop.withOptions(options); uCrop.start(PicturePreviewActivity.this); } } private void showPleaseDialog(String msg) { if (!isFinishing()) { dialog = new SweetAlertDialog(PicturePreviewActivity.this); dialog.setTitleText(msg); dialog.show(); } } private void dismiss() { if (dialog != null && dialog.isShowing()) { dialog.cancel(); } } @Override protected void onDestroy() { super.onDestroy(); if (RxBus.getDefault().isRegistered(this)) { RxBus.getDefault().unregister(this); } if (animation != null) { animation.cancel(); animation = null; } if (soundPool != null) { soundPool.stop(soundID); } } /** * 播放点击声音 */ private void playSound() { if (clickVideo) { soundPool.play( soundID, 0.1f, //左耳道音量【0~1】 0.5f, //右耳道音量【0~1】 0, //播放优先级【0表示最低优先级】 1, //循环模式【0表示循环一次,-1表示一直循环,其他表示数字+1表示当前数字对应的循环次数】 1 //播放速度【1是正常,范围从0~2】 ); } } }