上一篇可参考:https://blog.csdn.net/sunqihui22/article/details/94379568
GridView适配器:
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.ys.dzzhyjdc.R;
import com.ys.dzzhyjdc.map.activity.WuRenJiActivity;
import com.ys.dzzhyjdc.map.bean.PictureBean;
import java.util.ArrayList;
import java.util.List;
public class PictureAdapter extends BaseAdapter {
private LayoutInflater inflater;
private List<PictureBean> pictures;
private WuRenJiActivity wuRenJiActivity;
private ImageView[] imageViews;
private String[] images;
private String[] currentImages;
public PictureAdapter(String[] titles, String[] images, WuRenJiActivity context) {
super();
this.wuRenJiActivity = context;
this.images = images;
pictures = new ArrayList<>();
inflater = LayoutInflater.from(context);
for (int i = 0; i < images.length; i++) {
PictureBean picture = new PictureBean(titles[i], images[i]);
pictures.add(picture);
}
}
@Override
public int getCount() {
return images.length;
}
@Override
public Object getItem(int position) {
return images[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_picture, null);
viewHolder = new ViewHolder();
viewHolder.title = convertView.findViewById(R.id.title);
viewHolder.image = convertView.findViewById(R.id.image);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.title.setText(pictures.get(position).getTitles());
//把路径转换为bitmap显示
//viewHolder.image.setImageBitmap(BitmapFactory.decodeFile(pictures.get(position).getImages()));
//存放控件
if (imageViews == null) {
imageViews = new ImageView[images.length];
}
//存放照片URL
if (currentImages == null) {
currentImages = new String[images.length];
}
imageViews[position] = viewHolder.image;
//适配器会根据屏幕大小显示对应张数的图片,更多的会放在缓存中。
//所以这里需要将显示出来的图片放到数据里给后面图片展示用,不然会有图片无控件,这样就找不到控件资源导致报错
currentImages[position] = pictures.get(position).getImages();
//用Glide加载图片
wuRenJiActivity.showImage(pictures.get(position).getImages(), viewHolder.image);
final int currentPosition = position;
viewHolder.image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//详情跳转
wuRenJiActivity.startImageActivity(wuRenJiActivity, imageViews, currentImages, currentPosition);
}
});
return convertView;
}
class ViewHolder {
public TextView title;
public ImageView image;
}
}
页面跳转及处理方法:
public static void startImageActivity(Activity activity, ImageView[] imageViews, String[] imageUrls, int currentPosition) {
Intent intent = new Intent(activity, ImageShowActivity.class);
ArrayList<ImageBean> imageBeans = new ArrayList<>();
ArrayList<String> currentImage = new ArrayList<>();
for (final ImageView imageView : imageViews) {
final ImageBean imageBean = new ImageBean();
if (imageView != null) {
int location[] = new int[2];
imageView.getLocationOnScreen(location);
imageBean.left = location[0];
imageBean.top = location[1];
imageBean.width = imageView.getWidth();
imageBean.height = imageView.getHeight();
imageBeans.add(imageBean);
}
}
//长度需与imageBeans保持一致(多少张图片对应多少个控件)
for (final String url : imageUrls) {
if (url != null && !"".equals(url)){
currentImage.add(url);
}
}
intent.putParcelableArrayListExtra("imageBeans", imageBeans);
intent.putStringArrayListExtra("imageUrls",currentImage);
intent.putExtra("currentPosition", currentPosition);
activity.startActivity(intent);
activity.overridePendingTransition(0, 0);
}
ImageShowActivity相关处理:
package com.ys.dzzhyjdc.map.activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.wc.dragphoto.widget.DragPhotoView;
import com.ys.dzzhyjdc.R;
import com.ys.dzzhyjdc.map.bean.ImageBean;
import java.util.ArrayList;
/**
* 图片展示界面
*/
public class ImageShowActivity extends AppCompatActivity {
private FixMultiViewPager mViewPager;
private ArrayList<String> imageUrls;
private ArrayList<ImageBean> imageBeans;
private DragPhotoView[] mPhotoViews;
private int mStatusHeight;
private int currentPosition;
private boolean isShowStatusBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//将window扩展至全屏,并且不会覆盖状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
//避免在状态栏的显示状态发生变化时重新布局
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
setIsShowStatusBar(false);
mStatusHeight = getStatusHeight();
mViewPager = new FixMultiViewPager(this);
setContentView(mViewPager);
Intent intent = getIntent();
currentPosition = intent.getIntExtra("currentPosition", 0);
imageUrls = intent.getStringArrayListExtra("imageUrls");
imageBeans = intent.getParcelableArrayListExtra("imageBeans");
if (imageUrls == null || imageUrls.size() == 0) {
return;
}
mPhotoViews = new DragPhotoView[imageUrls.size()];
setPhotoViewAndViewPager();
//设置入场动画参数
mViewPager.getViewTreeObserver()
.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mViewPager.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
mViewPager.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
int left = imageBeans.get(currentPosition).left;
int top = imageBeans.get(currentPosition).top;
int height = imageBeans.get(currentPosition).height;
int width = imageBeans.get(currentPosition).width;
final DragPhotoView photoView = mPhotoViews[currentPosition];
int[] locationPhoto = new int[2];
photoView.getLocationOnScreen(locationPhoto);
float targetHeight = (float) photoView.getHeight();
float targetWidth = (float) photoView.getWidth();
float scaleX = (float) width / targetWidth;
float scaleY = (float) height / targetHeight;
float targetCenterX = locationPhoto[0] + targetWidth / 2;
float targetCenterY = locationPhoto[1] + targetHeight / 2;
float translationX = left + width / 2 - targetCenterX;
float translationY = top + height / 2 - targetCenterY;
photoView.setTranslationX(translationX);
photoView.setTranslationY(translationY);
photoView.setScaleX(scaleX);
photoView.setScaleY(scaleY);
photoView.performEnterAnimation(scaleX, scaleY);
for (DragPhotoView mPhotoView : mPhotoViews) {
mPhotoView.setMinScale(scaleX);
}
}
});
}
private void setPhotoViewAndViewPager() {
for (int i = 0; i < mPhotoViews.length; i++) {
mPhotoViews[i] = new DragPhotoView(this);
mPhotoViews[i].setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
showImage(imageUrls.get(i), mPhotoViews[i]);
mPhotoViews[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finishWithAnimation();
}
});
final int index = i;
mPhotoViews[i].setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Dialog dialog = new AlertDialog.Builder(ImageShowActivity.this)
.setTitle("长按Dialog").setMessage("这是第" + index + "个位置的图片")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).create();
dialog.show();
return true;
}
});
mPhotoViews[i].setOnDragListener(new DragPhotoView.OnDragListener() {
@Override
public void onDrag(DragPhotoView view, float moveX, float moveY) {
if (!isShowStatusBar) {
setIsShowStatusBar(true);
}
}
});
mPhotoViews[i].setOnTapListener(new DragPhotoView.OnTapListener() {
@Override
public void onTap(DragPhotoView view) {
if (isShowStatusBar) {
setIsShowStatusBar(false);
}
}
});
mPhotoViews[i].setOnExitListener(new DragPhotoView.OnExitListener() {
@Override
public void onExit(DragPhotoView view, float x, float y, float w, float h, int maxTranslateY) {
performExitAnimation(view, x, y, w, h);
// finish();
// overridePendingTransition(0, 0);
}
});
}
mViewPager.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
return imageUrls.size();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mPhotoViews[position]);
return mPhotoViews[position];
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mPhotoViews[position]);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
});
mViewPager.setCurrentItem(currentPosition);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
currentPosition = position;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private void performExitAnimation(final DragPhotoView view, float x, float y, float w, float h) {
mPhotoViews[currentPosition].performExitAnimation(this, imageBeans.get(currentPosition).left, imageBeans.get(currentPosition).top,
imageBeans.get(currentPosition).width, imageBeans.get(currentPosition).height);
}
private void finishWithAnimation() {
if (!isShowStatusBar) {
setIsShowStatusBar(true);
}
mPhotoViews[currentPosition].finishWithAnimation(this, imageBeans.get(currentPosition).left, imageBeans.get(currentPosition).top,
imageBeans.get(currentPosition).width, imageBeans.get(currentPosition).height);
}
@Override
public void onBackPressed() {
finishWithAnimation();
}
/**
* 显示图片
*/
public void showImage(String url, ImageView imageView) {
if (!TextUtils.isEmpty(url) && url.length() > 0) {
url = url.replaceAll(" ", "");
}
if (TextUtils.isEmpty(url)) {
return;
}
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setAdjustViewBounds(true);
Glide.with(this).load(url)
.dontAnimate()
.placeholder(R.drawable.ic_loding)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.error(R.drawable.ic_loding_error)
.into(imageView);
}
public int getStatusHeight() {
int statusHeight = 0;
try {
Class<?> clazz = Class.forName("com.android.internal.R$dimen");
Object object = clazz.newInstance();
int height = Integer.parseInt(clazz.getField("status_bar_height")
.get(object).toString());
statusHeight = getResources().getDimensionPixelSize(height);
} catch (Exception e) {
e.printStackTrace();
}
return statusHeight;
}
/**
* 不会导致Activity重新排版的全屏
*/
private void setIsShowStatusBar(boolean show) {
isShowStatusBar = show;
if (show) {
//显示
WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(attrs);
} else {
//隐藏
WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(attrs);
}
}
/**
* Author : suzeyu
* Time : 2016-12-26 上午1:41
* ClassDescription : 对多点触控场景时, {@link ViewPager#onInterceptTouchEvent(MotionEvent)}中
* pointerIndex = -1. 发生IllegalArgumentException: pointerIndex out of range 处理
*/
private class FixMultiViewPager extends ViewPager {
private final String TAG = FixMultiViewPager.class.getSimpleName();
public FixMultiViewPager(Context context) {
super(context);
}
public FixMultiViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
try {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d(TAG, "ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
Log.d(TAG, "ACTION_UP");
break;
}
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException ex) {
Log.w(TAG, "onInterceptTouchEvent() ", ex);
ex.printStackTrace();
}
return false;
}
}
//设置不能在3秒内连续点击两次返回按钮
private long mExitTime;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if ((System.currentTimeMillis() - mExitTime) > 3000) {
mExitTime = System.currentTimeMillis();
} else {
return true;
}
}
return super.onKeyDown(keyCode, event);
}
}