当前位置: 代码迷 >> Android >> Android-Gallery中兑现多点触摸
  详细解决方案

Android-Gallery中兑现多点触摸

热度:11   发布时间:2016-05-01 18:56:22.0
Android-Gallery中实现多点触摸
Android源码自带的Gallery不支持两个手指头缩放图片这样的多点触摸功能,所以这个得自己添加。

具体添加的代码很简单,修改一下/packages/apps/Gallery/src/com/android/camera/ViewImage.java中的rootListener就行了。

下面的代码只做了两点的情况,根据两点之间的距离长度的变化计算出缩放比例:
float scale = value / baseValue;

再乘上图片原本的缩放比例:
originalScale = mImageView.getScale();
originalScale*scale

得出图片的最终大小。

代码用到了ImageViewTouchBase提供的几个现成的方法:

mImageView.getScale()//当前的缩放比例。

mImageView.zoomTo(float scale, float centerX, float centerY)//最终缩放到多大比例。centerX和centerY是缩放的中心点,可以用两个手指的触摸点中间的那个点:[x0+x1)/2,(y0+y1)/2]。

OnTouchListener rootListener = new OnTouchListener() {//modified by lianbing 2011.5.23
private float baseValue, lastScale;
private float originalScale;
            public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
            baseValue = 0;
            lastScale = 0;
originalScale = mImageView.getScale();
        }
if (event.getAction() == MotionEvent.ACTION_MOVE) {
            if (event.getPointerCount() == 2) {
                float x = event.getX(0) - event.getX(1);
                float y = event.getY(0) - event.getY(1);
                float value = (float)Math.sqrt(x * x + y * y);//计算两点的距离
                // System.out.println("value:" + value);
                if (baseValue == 0) {
                    baseValue = value;
                } else {
                    float scale = value / baseValue;//当前两点间的距离除以手指落下时两点间的距离就是需要缩放的比例。
                    if (Math.abs(lastScale - scale) > 0.1) {//只有比例变化大于0.1时才进行缩放。
                        lastScale = scale;
                        // scale the image
                        mImageView.zoomTo(originalScale*scale, x + event.getX(1), y + event.getY(1));
                    }
                }
                return true;
            }
        }
                buttonListener.onTouch(v, event);
                mGestureDetector.onTouchEvent(event);
                // We do not use the return value of
                // mGestureDetector.onTouchEvent because we will not receive
                // the "up" event if we return false for the "down" event.
                return true;
            }
        };
另外,发现一部分机器上面有这样一个问题,在机器用USB连接到PC上时,触摸有些乱。平时用自己的机器在看小说时,如果手机正连着充电器,也会有触摸不准确的问题。

所以调试这一部分的程序时,最好拔掉USB线。
另外android.view.ScaleGestureDetector好像也是专门做这个的。。

转载:http://disanji.net/2011/08/28/android-gallery%E4%B8%AD%E5%AE%9E%E7%8E%B0%E5%A4%9A%E7%82%B9%E8%A7%A6%E6%91%B8/
  相关解决方案