2012-02-01 5 views
15

私は何を実装しようとしていますか?ViewPagerを使用した画像ギャラリー+ ImageViewsのズーム

ギャラリーのViewPagerを使用しています。このオプションはイメージ間のスムーズな切り替え(ImageViewを使用しています)が実装されているのですごく簡単です。

問題は何ですか?

私はこれをすべて実装できましたしかしズームが機能していません。私はで見ることができますLogCatどのようにそれが印刷されたZOOM(コードはポストの終わりにあります)が拡大されていません。次のコードについてのちょうど少数のノート:私は非同期的にウェブから画像をダウンロードするUrlImageViewHelperを使用してい

  • ImageViewHelperURL.setUrlDrawable((ImageView) img, url, R.drawable.no_image);
  • api.getListUrls()私は画像のURLを持っているArrayListです。

    • How to use Multi-touch in Android 2: Part 6, Implementing the Pinch Zoom Gesture:私はイメージ

      import android.content.Context; 
      import android.content.Intent; 
      import android.graphics.Matrix; 
      import android.graphics.PointF; 
      import android.os.Bundle; 
      import android.support.v4.app.ActionBar; 
      import android.support.v4.app.Fragment; 
      import android.support.v4.app.FragmentActivity; 
      import android.support.v4.app.FragmentManager; 
      import android.support.v4.app.FragmentPagerAdapter; 
      import android.support.v4.view.Menu; 
      import android.support.v4.view.MenuItem; 
      import android.support.v4.view.ViewPager; 
      import android.util.FloatMath; 
      import android.util.Log; 
      import android.view.LayoutInflater; 
      import android.view.MenuInflater; 
      import android.view.MotionEvent; 
      import android.view.View; 
      import android.view.View.OnTouchListener; 
      import android.view.ViewGroup; 
      import android.view.ViewGroup.LayoutParams; 
      import android.widget.Gallery; 
      import android.widget.ImageView; 
      import android.widget.Toast; 
      
      public class Slide extends FragmentActivity { 
          private ViewPager mPager; 
          public static Api api; 
          public static int POSITION; 
          public static ActionBar topbar; 
          public static Context ctx; 
      
          @Override 
          public void onCreate(Bundle savedInstanceState) { 
           super.onCreate(savedInstanceState); 
           setContentView(R.layout.fragment); 
           ctx = Slide.this; 
           POSITION = 0; 
           topbar = getSupportActionBar(); 
      
           /* get portadas */ 
           api = new Api(); 
           api.getUrlsFromAPI(); 
      
           topbar.setDisplayShowHomeEnabled(false); 
           topbar.setDisplayShowTitleEnabled(true); 
      
           mPager = (ViewPager) findViewById(R.id.pager); 
           mPager.setAdapter(new TestAdapter(getSupportFragmentManager())); 
          } 
      
          @Override 
          protected void onResume() { 
           // TODO Auto-generated method stub 
           super.onResume(); 
           mPager.setCurrentItem(POSITION); 
          } 
      
          static final class TestAdapter extends FragmentPagerAdapter { 
           public TestAdapter(FragmentManager fm) { 
            super(fm); 
           } 
      
           @Override 
           public int getCount() { 
            return api.getListUrls().size(); 
           } 
      
           @Override 
           public Fragment getItem(int position) { 
            TestFragment f = new TestFragment(); 
      
            f.url = api.getListUrls().get(position).getUrl(); 
            f.position = position; 
            return f; 
           } 
          } 
      
          public static class TestFragment extends Fragment { 
           String url = ""; 
           Integer position = 0; 
      
           public TestFragment() { 
            setRetainInstance(true); 
           } 
      
           @Override 
           public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setHasOptionsMenu(true); 
           } 
      
           @Override 
           public View onCreateView(LayoutInflater inflater, ViewGroup container, 
             Bundle savedInstanceState) { 
            ImageView img = new ImageView(getActivity()); 
      
            img.setPadding(6, 6, 6, 6) ; 
            img.setLayoutParams(new Gallery.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)) ; 
      
            ImageViewHelperURL.setUrlDrawable((ImageView) img, url, R.drawable.no_image) ; 
      
            img.setOnTouchListener(new OnTouchListener() { 
             private static final String TAG = "SlideImageView"; 
             // 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; 
      
             @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; 
                 Log.d(TAG, "ZOOOOOOOM: " + scale); 
                 matrix.postScale(scale, scale, mid.x, mid.y); 
                } 
               } 
               break; 
              } 
      
              view.setImageMatrix(matrix); 
              return true; // indicate event was handled 
             } 
      
             /** Show an event in the LogCat view, for debugging */ 
             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); 
             } 
            }); 
      
            return img; 
           } 
      
           @Override 
           public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
      
           } 
      
           @Override 
           public boolean onOptionsItemSelected(MenuItem item) { 
      
            return super.onOptionsItemSelected(item); 
           } 
          } 
      
      } 
      

    をR.drawableからImageViewのを使用して代わりのダウンロードも試してみた

  • は、私はすでにいない成功を収めて、次のチュートリアルを試してみました

+0

この質問の最後ですが、あなたのギャラリーにViewPagerを使用している場合、それらのフラグメントをリサイクルすることはありませんか?あなたはちょうど新しいものを作成し続けますか? – user291701

+0

私はそれらをリサイクルしていると思います。前の活動に戻ると、これは破壊されますか?しかし、私はこれの初心者です、私は確信していません。 –

答えて

9

ImageViewでマトリクスを使用してt彼のイメージはscale typeScaleType.Matrixに変更する必要があります。そうしないと効果はありません。デフォルトのスケールタイプはScaleType.FIT_CENTERなので、マトリックスは無視されます。

オリジナルのタスクに関しては、この作業を行うと、ImageViewのタッチジェスチャーがViewPagerのスクロールを妨げることがあります。これは、自然なViewPagerのスワイプの動きに直接対応しているため、シングルタッチのドラッグをサポートしている間は間違いなく問題になります。

+0

はい、あなたは干渉については正しいです...しかし、今私は画像をズームすることができます:)あなたは画像のギャラリーを実装するより良い方法を知っていますか?もちろん、ズームをサポートしています。 –

+0

私はまったく同じようにしました。干渉のために、私はViewPagerのふらつきジェスチャーを無効にしようとしました。それは素晴らしい仕事でしたが、私は理由がないため、範囲外のエラーからインデックスを取得しましたか?しかし、理由は私のオーバーライドViewPagerだった、私はバグがv4の互換性パッケージにあると思う。しかし、私は飛行機を無効にしてズームするだけの方法を見つけられませんでした。最初のポインタを持ち上げると、アプリがクラッシュする:( – Informatic0re