0

ページャーでページャーアダプターを渡したときに画像を1つずつスライドさせるコードと、その画像の配列を使用して、その画像をズームするのに役立ちます。ズームのコードを配置しましたが、機能しません。

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

}

4

1 に答える 1

0

問題 : ビューページャーにも独自のスライド機能があるため、ビューページャー内で使用している場合、Imagview ズームが正しく機能しません。

解決策:このタイプの機能を引き続き作成したい場合は、1 つのことを行うことができます。以下の方法でスワイプ不可のカスタムビューページャーを作成します。左右のビューに2つのボタンを追加し、そのボタンをクリックすると画面が変更されます。あとはそのままだろう。

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

}

これが役立つことを願っています。

于 2013-07-16T13:46:51.013 に答える