Галерея изображений с использованием ViewPager + увеличение ImageViews

Что я пытаюсь реализовать?

галерею изображений с использованием ViewPager. Я выбрал этот вариант, потому что плавный переход между изображениями (я использую ImageView), это красиво и довольно просто реализовать.

В чем конкретно моя проблема?

Я смог реализовать все это, но масштабирование не работает. Я вижу в LogCat как выводится ZOOM (код в конце поста), но изображение не увеличивается. Несколько замечаний по поводу следующего кода:

  • ImageViewHelperURL.setUrlDrawable((ImageView) img, url, R.drawable.no_image); Я использую UrlImageViewHelper для асинхронной загрузки изображений из интернета.
  • api.getListUrls() Это ArrayList, в котором у меня есть урлы изображений.
  • Я также пробовал использовать ImageView из R.drawable вместо загрузки изображения

    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();
    
     /* получить портады */
     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 Автогенерируемая заглушка метода
     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, 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";
     // Эти матрицы будут использоваться для перемещения и масштабирования изображения
     Matrix matrix = new Matrix();
     Matrix savedMatrix = new Matrix();
    
     // Мы можем находиться в одном из этих 3 состояний
     static final int NONE = 0;
     static final int DRAG = 1;
     static final int ZOOM = 2;
     int mode = NONE;
    
     // Запомните некоторые вещи для масштабирования
     PointF start = new PointF();
     PointF mid = new PointF();
     float oldDist = 1f;
    
     @Override
     public boolean onTouch(View v, MotionEvent event) {
     ImageView view = (ImageView) v;
    
     // Сбрасываем событие касания в журнал
     dumpEvent(event);
    
     // Обрабатываем события касания здесь...
     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, "ZOOOOOOOOOM: " + scale);
     matrix.postScale(scale, scale, mid.x, mid.y);
     }
     }
     break;
     }
    
     view.setImageMatrix(matrix);
     return true; // указывает, что событие было обработано
     }
    
     /** Показать событие в представлении LogCat, для отладки */
     private void dumpEvent(MotionEvent event) {
     String names[] = { "DOWN", "UP", "MOVE", "CANCEL",
     "СНАРУЖИ", "УКАЗАТЕЛЬ_ВНИЗ", "УКАЗАТЕЛЬ_ВВЕРХ", "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 

Я уже безуспешно пробовал следующее руководство:

15
задан Juan Ramón 1 February 2012 в 01:07
поделиться