缩放图像在viewpazer内和滑动

时间:2013-07-16 13:34:37

标签: android android-viewpager

我有代码一个接一个地滑动图像,因为我在寻呼机中传递了寻呼机适配器和一个成像的数组,帮我缩放图像,我把缩放代码但它不起作用, 谢谢你提前。

public class FullImageActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.braidfullimage);

    // get intent data
    Intent i = getIntent();

    // Selected image id
    int position = i.getExtras().getInt("id");

    ViewPager pager=(ViewPager) findViewById(R.id.view_pager_braid);
    barid_adapter imageAdapter = new barid_adapter();
    pager.setAdapter(imageAdapter);

    pager.getCurrentItem();


    /*ImageView imageView = (ImageView) findViewById(R.id.braid_full_image_view);
    imageView.setImageResource(imageAdapter.mThumbIds[position]);*/
}
   class barid_adapter extends PagerAdapter {
       private static final String TAG = "Touch";
       // These matrices will be used to move and zoom image
       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 DRAG = 1;
       static final int ZOOM = 2;
       int mode = NONE;

       // Remember some things for zooming
       PointF start = new PointF();
       PointF mid = new PointF();
       float oldDist = 1f;

    public Integer[] mThumbIds = {
            R.drawable.dss, R.drawable.hygienicbraid,/* R.drawable.daniellayaki,*/
            /*R.drawable.hygienicbraid, R.drawable.loosedeep,
            R.drawable.yakicurl, */
    };

    public int getCount() {
        return mThumbIds.length;
    }
      @Override
        public Object instantiateItem(ViewGroup container, int position) {
          Context context = FullImageActivity.this;

          ImageView imageView = new ImageView(context);
          imageView.setScaleType(ImageView.ScaleType.MATRIX);
          imageView.setImageResource(mThumbIds[position]);
          imageView.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                  ImageView view = (ImageView) v;

                  // Dump touch event to log
                  dumpEvent(event);

                  // Handle touch events here...
                  switch (event.getAction() & MotionEvent.ACTION_MASK) {
                  case MotionEvent.ACTION_DOWN:
                     savedMatrix.set(matrix);
                     start.set(event.getX(), event.getY());
                     Log.d(TAG, "mode=DRAG");
                     mode = DRAG;
                     break;
                  case MotionEvent.ACTION_POINTER_DOWN:
                     oldDist = spacing(event);
                     Log.d(TAG, "oldDist=" + oldDist);
                     if (oldDist > 10f) {
                        savedMatrix.set(matrix);
                        midPoint(mid, event);
                        mode = ZOOM;
                        Log.d(TAG, "mode=ZOOM");
                     }
                     break;
                  case MotionEvent.ACTION_UP:
                  case MotionEvent.ACTION_POINTER_UP:
                     mode = NONE;
                     Log.d(TAG, "mode=NONE");
                     break;
                  case MotionEvent.ACTION_MOVE:
                     if (mode == DRAG) {
                        // ...
                        matrix.set(savedMatrix);
                        matrix.postTranslate(event.getX() - start.x,
                              event.getY() - start.y);
                     }
                     else if (mode == ZOOM) {
                        float newDist = spacing(event);
                        Log.d(TAG, "newDist=" + newDist);
                        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
               }
        });


          ((ViewPager) container).addView(imageView, 0);
          return imageView;
        }

      private void dumpEvent(MotionEvent event) {
          String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
                "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
          StringBuilder sb = new StringBuilder();
          int action = event.getAction();
          int actionCode = action & MotionEvent.ACTION_MASK;
          sb.append("event ACTION_").append(names[actionCode]);
          if (actionCode == MotionEvent.ACTION_POINTER_DOWN
                || actionCode == MotionEvent.ACTION_POINTER_UP) {
             sb.append("(pid ").append(
                   action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
             sb.append(")");
          }
          sb.append("[");
          for (int i = 0; i < event.getPointerCount(); i++) {
             sb.append("#").append(i);
             sb.append("(pid ").append(event.getPointerId(i));
             sb.append(")=").append((int) event.getX(i));
             sb.append(",").append((int) event.getY(i));
             if (i + 1 < event.getPointerCount())
                sb.append(";");
          }
          sb.append("]");
          Log.d(TAG, sb.toString());
       }

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


    @Override
    public boolean isViewFromObject(View view, Object object) {

        return view == ((ImageView) object);
    }
     @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
          ((ViewPager) container).removeView((ImageView) object);
        }



}

}

1 个答案:

答案 0 :(得分:0)

问题:如果您在viewpager中使用它,Imagview缩放将无法正常工作,因为viewpager也将拥有自己的幻灯片功能。

解决方案:如果您仍想制作此类功能,那么您可以做一件事。使自定义viewpager通过以下方式不可用。在视图中为左右添加两个按钮,并在单击该按钮时更改屏幕。剩下的事情就是这样。

public class NonSwipeableViewPager extends ViewPager {

    public NonSwipeableViewPager(Context context) {
        super(context);
    }

    public NonSwipeableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        // Never allow swiping to switch between pages
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages
        return false;
    }

}

希望这会有所帮助。