package com.dy;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import tool.BitmapTool;
import tool.ScreenTool;
import tool.ScreenTool.Screen;
import com.dy.R;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.Toast;
public class PictureActivity extends Activity implements OnTouchListener,
OnGestureListener {
private ImageView pictureImageView;
// pictureImageView的宽和高
private int pictureImageViewWidth = 0;
private int pictureImageViewHeight = 0;
// 屏幕宽和高
private Screen screen;
private int screenWidth;
private int screenHeight;
// 文件地址列表
private ArrayList<String> filePath;
// 在文件地址列表中的当前位置
private int position;
// 用于设置pictureImageView的矩阵
private Matrix setMatrix = new Matrix();
// 暂存之前的矩阵
private Matrix savedMatrix = new Matrix();
// 记录加载后原始的矩阵
private Matrix initialMatrix = new Matrix();
private GestureDetector gestureDetector;
// 记录是否返回手势指令
private boolean isReturnGesture = true;
// 手势模式
private static final int NONE = 0;
private static final int DRAG = 1;
private static final int ZOOM = 2;
private int mode = NONE;
// 手势的起点和中点
private PointF start = new PointF();
private PointF mid = new PointF();
// 两个手指拉开前的距离
private float oldDistance = 1f;
// 加载的图片
private Bitmap bitmap;
// 图片加载压缩后的宽和高
private int bitmapWidth;
private int bitmapHeight;
// 图片放在控件后的宽和高
private int bitmapRealWidth = 0;
private int bitmapRealHeight = 0;
// 图片共放缩的倍数
private float scaleTotalTimes = 1f;
// 存储当前放缩的倍数
private float scaleNowTimes;
// 存放上次放缩的倍数
private float scaleLastTimes = 0f;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.picture);
// 设置imageView的配置
this.pictureImageView = (ImageView) this
.findViewById(R.id.pictureImageView);
pictureImageView.setLongClickable(true);
pictureImageView.setOnTouchListener(this);
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
filePath = bundle.getStringArrayList("filePath");
position = bundle.getInt("index");
// 调用工具类得到屏幕的大小
screen = ScreenTool.getScreenPix(this);
this.screenWidth = screen.widthPixels;
this.screenHeight = screen.heightPixels;
// 设置手势类
gestureDetector = new GestureDetector(this);
gestureDetector.setIsLongpressEnabled(true);
// 加载图片到pictureImageView
this.LoadBitmap();
}
// 触摸屏幕
public boolean onTouch(View v, MotionEvent event) {
ImageView view = (ImageView) v;
float scaleTemp = 1f;
switch (event.getAction() & MotionEvent.ACTION_MASK) {
// 点击屏幕
case MotionEvent.ACTION_DOWN:
setMatrix.set(view.getImageMatrix());
// 暂存原来的矩阵
savedMatrix.set(setMatrix);
start.set(event.getX(), event.getY());
// 拖放模式
mode = DRAG;
break;
// 多点触摸
case MotionEvent.ACTION_POINTER_DOWN:
// 计算两指距离
oldDistance = spacing(event);
if (oldDistance > 10f) {
savedMatrix.set(setMatrix);
// 取得两指的中点
midPoint(mid, event);
// 缩放模式
mode = ZOOM;
}
break;
// 屏幕上所有手指放开时触发
case MotionEvent.ACTION_UP:
// 用户是否缩放
if (this.scaleNowTimes != 0
&& Math.abs(this.scaleLastTimes - this.scaleNowTimes) > 0.0001) {
// 更新总缩放倍数
this.scaleTotalTimes = this.scaleTotalTimes
* this.scaleNowTimes;
// 保存为上次缩放倍数
this.scaleLastTimes = this.scaleNowTimes;
}
// 计算边界,返回边界极限值
float moveResult[] = this.computerLimit(this.scaleTotalTimes,
event.getX());
// 用于缩小超过极限,重新设置矩阵
if (moveResult == null) {
setMatrix.set(initialMatrix);
this.isReturnGesture = true;
} else {
// 需要下一张图
if (moveResult[2] == 1f) {
this.isReturnGesture = true;
}
// 矫正图片位置
setMatrix.postTranslate(moveResult[0], moveResult[1]);
}
break;
// 屏幕上有多只手指时(大于一只),当其中一只放开时触发
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
// 读取原来的矩阵
setMatrix.set(savedMatrix);
setMatrix.postTranslate(event.getX() - start.x, event.getY()
- start.y);
} else if (mode == ZOOM) {
// 取得划完之后两个手指的距离
float newDist = spacing(event);
if (newDist > 10f) {
// 读取原来的矩阵
setMatrix.set(savedMatrix);
// 计算缩放比率
scaleTemp = newDist / oldDistance;
// 记录缩放比率
this.scaleNowTimes = scaleTemp;
setMatrix.postScale(scaleTemp, scaleTemp, mid.x, mid.y);
// 不需要下一张图
this.isReturnGesture = false;
}
}
break;
}
view.setImageMatrix(setMatrix);
// 判断是否需要下一张
if (this.isReturnGesture)
return gestureDetector.onTouchEvent(event);
else
return true;
}
// 两个手指之间的距离
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
// 取得两个手指的中点
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
public boolean onDown(MotionEvent e) {
return false;
}
// 滑动下一张图
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
float x = e2.getX() - e1.getX();
float y = e2.getY() - e1.getY();
// 限制必须得划过屏幕的1/3才能算划过
float x_limit = screen.widthPixels / 3;
float x_abs = Math.abs(x);
float y_abs = Math.abs(y);
if (x_abs >= y_abs) {
if (x > x_limit || x < -x_limit) {
if (x > 0) {
// 向右划
position--;
while (position >= 0 && !isFile(filePath.get(position))) {
position--;
}
if (position >= 0) {
// 添加滑动的动画
TranslateAnimation trans = new TranslateAnimation(-x,
0, -y, 0);
trans.setDuration(300);
pictureImageView.startAnimation(trans);
// 加载图片
this.LoadBitmap();
} else {
show("到顶了");
position++;
while (!isFile(filePath.get(position))) {
position++;
}
}
} else if (x <= 0) {
// 向左划
position++;
while (position < filePath.size()
&& !isFile(filePath.get(position))) {
position++;
}
if (position < filePath.size()) {
// 添加滑动的动画
TranslateAnimation trans = new TranslateAnimation(-x,
0, -y, 0);
trans.setDuration(500);
pictureImageView.startAnimation(trans);
// 加载图片
this.LoadBitmap();
} else {
show("到底了");
position--;
while (!isFile(filePath.get(position))) {
position--;
}
}
}
}
}
return true;
}
// 初始化图片的矩阵
private void initialMatrix() {
Matrix tempMatrix = this.pictureImageView.getImageMatrix();
tempMatrix.reset();
// 图片的真实宽和高
int imageWidth = this.bitmapWidth;
int imageHeight = this.bitmapHeight;
float temp = 1f;
float moveHeight = 0f;
float moveWidth = 0f;
// 图片宽大于高
if
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
OOM.rar (49个子文件)
image
bin
classes.dex 27KB
image.apk 38KB
res
drawable-ldpi
ic_launcher.png 2KB
drawable-hdpi
ic_launcher.png 4KB
drawable-mdpi
ic_launcher.png 2KB
folder.png 3KB
document.png 5KB
classes
com
dy
R$layout.class 421B
R$id.class 773B
R$drawable.class 433B
R$attr.class 304B
ListViewActivity.class 7KB
R.class 447B
PictureActivity.class 10KB
R$string.class 419B
ListViewActivity$1.class 3KB
ListViewActivity$2.class 2KB
tool
Tool.class 2KB
ScreenTool.class 1KB
ScreenTool$Screen.class 853B
BitmapTool.class 3KB
deal
LoadIcon.class 2KB
ImageSimpleAdapter.class 4KB
LoadIcon$1.class 951B
LoadIcon$2.class 2KB
resources.ap_ 22KB
res
drawable-ldpi
ic_launcher.png 2KB
drawable-hdpi
ic_launcher.png 4KB
values
strings.xml 234B
drawable-mdpi
ic_launcher.png 3KB
folder.png 6KB
document.png 5KB
layout
listview.xml 2KB
picture.xml 784B
main.xml 964B
assets
gen
com
dy
R.java 2KB
proguard.cfg 1KB
.settings
org.eclipse.jdt.core.prefs 208B
src
com
dy
ListViewActivity.java 8KB
PictureActivity.java 15KB
tool
ScreenTool.java 874B
Tool.java 1KB
BitmapTool.java 3KB
deal
LoadIcon.java 2KB
ImageSimpleAdapter.java 4KB
.project 841B
.classpath 364B
project.properties 360B
AndroidManifest.xml 800B
共 49 条
- 1
Jamin_正宗红罐辣酱
- 粉丝: 78
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页