java - 捏合以缩放 ViewPager 中的 ImageView ? onTouch 事件不起作用?

标签 java android android-layout

我浏览了很多关于堆栈溢出的帖子,但无法找到可能的解决方案。

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);
        }
    }

基本上是使用 ViewPager 实现的图像 GalleryView。 我正在根据可绘制数组的位置膨胀 ImageView 。 现在我想为我的应用程序实现捏合缩放功能。但是我无法在 ViewPager 中的 ImageView 上获得 Touch 事件。我在没有 ViewPager 的情况下测试了我的 onTouchEvent 捏合缩放,它工作正常。它不适用于 View Pager。我猜 ViewPager 没有为 subview 处理触摸事件。 我需要捏一下才能缩放到 ViewPager 中的 ImageView 吗?

最佳答案

如果您的 viewpager 使用 imageView,那么您可以使用 touchImageView。通过下面的链接,您可以使用源代码来解决您的问题。

https://github.com/MikeOrtiz/TouchImageView/blob/master/src/com/example/touch/TouchImageView.java

最后,只需用这个自定义 View 替换您当前的 ImageView 。如果在实现过程中遇到任何问题,请告诉我,我会尽力澄清这一点。

关于java - 捏合以缩放 ViewPager 中的 ImageView ? onTouch 事件不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12745971/

相关文章:

android - 获取 LAUNCHER2 源代码?

android - Android Doze 模式下维护窗口的频率

android - onMeasure() 以 EXACTLY 和规范大小 0 调用

java - 在 Spring 的配置类中获取经过身份验证的用户

java - 循环调用 SwingUtilities.invokeAndWait

java - Actionbar 顶部的 DrawerLayout

android - 相对布局中的TextView水平中心

android - 使用矢量资源以编程方式更改 ImageView 的背景色调作为背景

java - 如何让 maven 获取发布父 pom 而不是最新的?

java - 将java sql时间戳转换为字符串