Java 是否在ViewPager内对ImageView进行收缩缩放?onTouch事件不起作用?
我在stack overflow中浏览了很多帖子,但没有找到可能的解决方案Java 是否在ViewPager内对ImageView进行收缩缩放?onTouch事件不起作用?,java,android,android-layout,Java,Android,Android Layout,我在stack overflow中浏览了很多帖子,但没有找到可能的解决方案 package com.sourcebits.gallerygestures; import android.app.Activity; import android.graphics.Matrix; import android.graphics.PointF; import android.os.Bundle; import android.support.v4.view.P
package com.sourcebits.gallerygestures;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
/**
*
* @author Rajeev N B
*
*/
public class GalleryActivity extends Activity implements OnTouchListener {
/**
* Activity Context
*/
private GalleryActivity context;
/**
* List of drawables
*/
private int[] mImages = new int[6];
/**
* ViewPager for displaying images
*/
private ViewPager viewPager;
/**
* Matrices used for Pinch and Zoom
*/
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
// We can be in one of these 3 states
static final int NONE = 0;
static final int ZOOM = 2;
int mode = NONE;
// Remember some things for zooming
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gallery);
context = GalleryActivity.this;
viewPager = (ViewPager) findViewById(R.id.pager);
ImagePagerAdapter adapter = new ImagePagerAdapter();
viewPager.setAdapter(adapter);
}
/**
*
* @author Rajeev N B Adapter for displaying the images
*
*/
private class ImagePagerAdapter extends PagerAdapter {
private int[] mImages = { R.drawable.background, R.drawable.koskula,
R.drawable.wallpaper, R.drawable.wallpap, R.drawable.gr,
R.drawable.balck };
private int pos;
private ImageView imageView;
/**
* Default Constructor
*/
public ImagePagerAdapter() {
}
/**
* Get the Count of the Pages for the View Pager
*/
@Override
public int getCount() {
return mImages.length;
}
/**
* Get the View from the Object
*/
@Override
public boolean isViewFromObject(View view, Object object) {
pos = viewPager.getCurrentItem();
return view == ((ImageView) object);
}
/**
* Create a new Item in the viewPager
*/
@Override
public Object instantiateItem(ViewGroup container, final int position) {
Button prev = (Button) findViewById(R.id.button1);
Button next = (Button) findViewById(R.id.button2);
next.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (pos < mImages.length)
viewPager.setCurrentItem(pos + 1);
Log.v("Next", "" + pos);
}
});
prev.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (pos > 0)
viewPager.setCurrentItem(pos - 1);
Log.v("Next", "" + pos);
}
});
imageView = new ImageView(context);
int padding = context.getResources().getDimensionPixelSize(
R.dimen.padding_medium);
imageView.setPadding(padding, padding, padding, padding);
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
imageView.setImageResource(mImages[position]);
((ViewPager) container).addView(imageView, 0);
imageView.setOnTouchListener(context);
return imageView;
}
/**
* Destroy the Items
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((ImageView) object);
}
}
/**
* Pinch to zoom Functionality
*/
public boolean onTouch(View v, MotionEvent event) {
ImageView view = (ImageView) v;
// Handle touch events here...
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
case MotionEvent.ACTION_MOVE:
if (mode == ZOOM) {
float newDist = spacing(event);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oldDist;
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
}
view.setImageMatrix(matrix);
return true; // indicate event was handled
}
/** Determine the space between the first two fingers */
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);
}
/** Calculate the mid point of the first two fingers */
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);
}
}
package com.sourcebits.gallerybits;
导入android.app.Activity;
导入android.graphics.Matrix;
导入android.graphics.PointF;
导入android.os.Bundle;
导入android.support.v4.view.PagerAdapter;
导入android.support.v4.view.ViewPager;
导入android.util.FloatMath;
导入android.util.Log;
导入android.view.MotionEvent;
导入android.view.view;
导入android.view.view.OnTouchListener;
导入android.view.ViewGroup;
导入android.widget.Button;
导入android.widget.ImageView;
/**
*
*@作者Rajeev N B
*
*/
公共类GalleryActivity将活动实现扩展到TouchListener{
/**
*活动上下文
*/
私人厨房活动环境;
/**
*提款单
*/
私有int[]mImages=新int[6];
/**
*用于显示图像的ViewPager
*/
私人视页机视页机;
/**
*用于收缩和缩放的矩阵
*/
矩阵=新矩阵();
矩阵savedMatrix=新矩阵();
//我们可能处于这三种状态之一
静态最终int NONE=0;
静态最终整数缩放=2;
int模式=无;
//记住一些关于缩放的事情
PointF start=新的PointF();
PointF mid=新的PointF();
浮动oldDist=1f;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gallery);
上下文=GalleryActivity.this;
viewPager=(viewPager)findViewById(R.id.pager);
ImagePagerAdapter适配器=新的ImagePagerAdapter();
viewPager.setAdapter(适配器);
}
/**
*
*@author Rajeev N B用于显示图像的适配器
*
*/
私有类ImagePagerAdapter扩展了PagerAdapter{
private int[]mImages={R.drawable.background,R.drawable.koskula,
R.drawable.wallpap,R.drawable.gr,
R.drawable.balck};
私人国际邮政局;
私人影像视图;
/**
*默认构造函数
*/
公共图像页雷达(){
}
/**
*获取查看寻呼机的页数
*/
@凌驾
public int getCount(){
返回图像长度;
}
/**
*从对象获取视图
*/
@凌驾
公共布尔值isViewFromObject(视图,对象){
pos=viewPager.getCurrentItem();
返回视图==((图像视图)对象);
}
/**
*在viewPager中创建新项目
*/
@凌驾
公共对象实例化项(视图组容器,最终int位置){
按钮prev=(按钮)findViewById(R.id.button1);
按钮下一步=(按钮)findViewById(R.id.button2);
next.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
如果(位置<图像长度)
viewPager.setCurrentItem(位置+1);
Log.v(“下一个“,”+pos);
}
});
prev.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
如果(位置>0)
viewPager.setCurrentItem(位置-1);
Log.v(“下一个“,”+pos);
}
});
imageView=新的imageView(上下文);
int padding=context.getResources().getDimensionPixelSize(
R.二聚体(培养基);
setPadding(padding,padding,padding,padding);
imageView.setScaleType(imageView.ScaleType.CENTER_内);
setImageResource(mImages[position]);
((ViewPager)容器).addView(imageView,0);
setOnTouchListener(上下文);
返回图像视图;
}
/**
*销毁物品
*/
@凌驾
公共项(视图组容器、int位置、对象){
((ViewPager)容器)。移除视图((ImageView)对象);
}
}
/**
*收缩缩放功能
*/
公共布尔onTouch(视图v,运动事件){
ImageView视图=(ImageView)v;
//在这里处理触摸事件。。。
开关(event.getAction()&MotionEvent.ACTION\u掩码){
case MotionEvent.ACTION\u DOWN:
savedMatrix.set(矩阵);
set(event.getX(),event.getY());
打破
case MotionEvent.ACTION\u指针\u向下:
oldDist=间距(事件);
如果(旧区>10f){
savedMatrix.set(矩阵);
中点(中点,事件);
模式=缩放;
}
打破
case MotionEvent.ACTION\u UP:
case MotionEvent.ACTION\u指针\u向上:
模式=无;
打破
case MotionEvent.ACTION\u移动:
如果(模式==缩放){
float newDist=间距(事件);
如果(新距离>10f){
矩阵集(savedMatrix);
浮动比例=新距离/旧距离;