2013-11-15 4 views
2

Я использую PhotoView от Chris Banes вместе с Universal Image Loader в ViewPager. Все работает хорошо, за исключением того, что при увеличении изображения, будь то двойным нажатием или жестом, изображение увеличивается, но исходные размеры изображений не изменяются. Это означает, что, если, например, изображение отображается со скоростью 100x200, изображение может быть увеличено, но ImageView по-прежнему 100x200. Я пробовал звонить PhotoView в коде вместо ImageView, но результат тот же. И я попытался позвонить uk.co.senab.photoview.PhotoView в ViewPager XML вместо android.support.v4.view.ViewPager, но опять же, без изменений, размеры изображения не расширяются вместе с изображением. Вот мой код: Пейджер активность:Границы изображения фотографий не изменяются

import android.content.Intent; 
import android.content.res.Configuration; 
import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.os.Parcelable; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.ProgressBar; 
import android.widget.Toast; 

import com.myapp.tnt.TNTConstants.Extra; 
import com.nostra13.universalimageloader.core.DisplayImageOptions; 
import com.nostra13.universalimageloader.core.assist.FailReason; 
import com.nostra13.universalimageloader.core.assist.ImageScaleType; 
import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener; 
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; 

import uk.co.senab.photoview.PhotoView; 
import uk.co.senab.photoview.PhotoViewAttacher; 

/** 
* @author Sergey Tarasevich (nostra13[at]gmail[dot]com) 
*/ 
public class UILPager extends BaseActivity { 

private static final String STATE_POSITION = "STATE_POSITION"; 
DisplayImageOptions options; 
ViewPager pager; 
PhotoViewAttacher mAttacher; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.uil_viewpager); 

    Bundle bundle = getIntent().getExtras(); 
    String[] imageUrls = bundle.getStringArray(Extra.IMAGES); 
    int pagerPosition = bundle.getInt(Extra.IMAGE_POSITION, 0); 

    if (savedInstanceState != null) { 
     pagerPosition = savedInstanceState.getInt(STATE_POSITION); 
    } 

    options = new DisplayImageOptions.Builder() 
      .showImageForEmptyUri(R.drawable.ic_empty) 
      .showImageOnFail(R.drawable.ic_error) 
      .resetViewBeforeLoading(true).cacheOnDisc(true) 
      .imageScaleType(ImageScaleType.NONE) 
      .bitmapConfig(Bitmap.Config.RGB_565) 
      .displayer(new FadeInBitmapDisplayer(300)).build(); 

    pager = (HackyViewPager) findViewById(R.id.uil_impager); 
    pager.setAdapter(new ImagePagerAdapter(imageUrls)); 
    pager.setCurrentItem(pagerPosition); 

}// --- END onCreate 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putInt(STATE_POSITION, pager.getCurrentItem()); 
} 

private class ImagePagerAdapter extends PagerAdapter { 

    private String[] images; 
    private LayoutInflater inflater; 

    ImagePagerAdapter(String[] images) { 
     this.images = images; 
     inflater = getLayoutInflater(); 
    } 

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

    @Override 
    public void finishUpdate(View container) { 
    } 

    @Override 
    public int getCount() { 
     return images.length; 
    } 

    @Override 
    public Object instantiateItem(ViewGroup view, int position) { 
     View imageLayout = inflater.inflate(R.layout.uil_viewpager_item, 
       view, false); 
     ImageView phView = (ImageView) imageLayout.findViewById (R.id.uil_vpager_image); 
    // Attach a PhotoViewAttacher, which takes care of all of the zooming functionality. 
    mAttacher = new PhotoViewAttacher(phView); 
    final ProgressBar spinner = (ProgressBar) imageLayout.findViewById(R.id.uil_vpager_prog); 
    imageLoader.displayImage(images[position], phView, options, new  SimpleImageLoadingListener() { 
     @Override 
     public void onLoadingStarted(String imageUri, View view) { 
      spinner.setVisibility(View.VISIBLE); 
     } 

        @Override 
        public void onLoadingFailed(String imageUri, View view, 
          FailReason failReason) { 
         String message = null; 
         switch (failReason.getType()) { 
         case IO_ERROR: 
          message = "Input/Output error"; 
          break; 
         case DECODING_ERROR: 
          message = "Image can't be decoded"; 
          break; 
         case NETWORK_DENIED: 
          message = "Downloads are denied"; 
          break; 
         case OUT_OF_MEMORY: 
          message = "Out Of Memory error"; 
          break; 
         case UNKNOWN: 
          message = "Unknown error"; 
          break; 
         } 
         Toast.makeText(UILPager.this, message, 
           Toast.LENGTH_SHORT).show (); 

         spinner.setVisibility(View.GONE); 
        } 

        @Override 
        public void onLoadingComplete(String imageUri, 
          View view, Bitmap loadedImage) { 
         spinner.setVisibility(View.GONE); 
        } 
       }); 

     ((ViewPager) view).addView(imageLayout, 0); 
     return imageLayout; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view.equals(object); 
    } 

    @Override 
    public void restoreState(Parcelable state, ClassLoader loader) { 
    } 

    @Override 
    public Parcelable saveState() { 
     return null; 
    } 

    @Override 
    public void startUpdate(View container) { 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.splash, menu); 
    return true; 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    overridePendingTransition(R.anim.fadein, R.anim.fadeout); 
    UILPager.this.finish(); 
} 
} 

И вот XML для Пейджер Items:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:padding="1dip" > 

<ImageView 
    android:id="@+id/uil_vpager_image" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:adjustViewBounds="true" 
    android:contentDescription="@string/descr_image" /> 

<ProgressBar 
    android:id="@+id/uil_vpager_prog" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:visibility="gone" /> 

</FrameLayout> 

Кто-нибудь работать в этом, если да, то это исправить? Я использую SDK 10, и получаю тот же результат на своем телефоне Android 2.3.4 и Android-планшете Android 4.3.

ответ

1

Я понял. Было несколько вещей, которые я делал неправильно. Основной из них: для PhotoView, чтобы иметь возможность расширяться за пределы исходного изображения, вы не можете поместить его в ImageLayout, вам нужно создать PhotoView (не ImageView) в коде, а не в XML. Итак, вот моя исправленная деятельность пейджера:

package com.myapp.wcbc; 

import android.content.Intent; 
import android.content.res.Configuration; 
import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.os.Parcelable; 
import android.support.v4.view.PagerAdapter; 
import android.view.ViewGroup.LayoutParams; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.ProgressBar; 
import android.widget.Toast; 

import com.myapp.wcbc.TNTConstants.Extra; 
import com.nostra13.universalimageloader.core.DisplayImageOptions; 
import com.nostra13.universalimageloader.core.assist.FailReason; 
import com.nostra13.universalimageloader.core.assist.ImageScaleType; 
import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener; 
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; 

import com.myapp.wcbc.HackyViewPager; 
import uk.co.senab.photoview.PhotoView; 
import uk.co.senab.photoview.PhotoViewAttacher; 

/** 
* @author Sergey Tarasevich (nostra13[at]gmail[dot]com) 
*/ 
public class UILPager extends BaseActivity { 

private static final String STATE_POSITION = "STATE_POSITION"; 
DisplayImageOptions options; 
ViewPager pager; 
PhotoViewAttacher mAttacher; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.uk_vp); 

    Bundle bundle = getIntent().getExtras(); 
    String[] imageUrls = bundle.getStringArray(Extra.IMAGES); 
    int pagerPosition = bundle.getInt(Extra.IMAGE_POSITION, 0); 

    if (savedInstanceState != null) { 
     pagerPosition = savedInstanceState.getInt(STATE_POSITION); 
    } 

    options = new DisplayImageOptions.Builder() 
      .showImageForEmptyUri(R.drawable.ic_empty) 
      .showImageOnFail(R.drawable.ic_error) 
      .resetViewBeforeLoading(true).cacheOnDisc(true) 
      .imageScaleType(ImageScaleType.EXACTLY) 
      .bitmapConfig(Bitmap.Config.RGB_565) 
      .displayer(new FadeInBitmapDisplayer(300)).build(); 

    pager = (HackyViewPager) findViewById(R.id.uk_pager); 
    pager.setAdapter(new ImagePagerAdapter(imageUrls)); 
    pager.setCurrentItem(pagerPosition); 

}// --- END onCreate 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putInt(STATE_POSITION, pager.getCurrentItem()); 
} 

private class ImagePagerAdapter extends PagerAdapter { 

    private String[] images; 

    ImagePagerAdapter(String[] images) { 
     this.images = images; 
    } 

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

    @Override 
    public void finishUpdate(View container) { 
    } 

    @Override 
    public int getCount() { 
     return images.length; 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     PhotoView phView = new PhotoView(container.getContext()); 
    // Attach a PhotoViewAttacher, which takes care of all of the zooming functionality. 
    mAttacher = new PhotoViewAttacher(phView); 
    final ProgressBar spinner = new ProgressBar(container.getContext()); 
    imageLoader.displayImage(images[position], phView, options, new  SimpleImageLoadingListener() { 
     @Override 
     public void onLoadingStarted(String imageUri, View view) { 
      spinner.setVisibility(View.VISIBLE); 
     } 

        @Override 
        public void onLoadingFailed(String imageUri, View view, 
          FailReason failReason) { 
         String message = null; 
         switch (failReason.getType()) { 
         case IO_ERROR: 
          message = "Input/Output error"; 
          break; 
         case DECODING_ERROR: 
          message = "Image can't be decoded"; 
          break; 
         case NETWORK_DENIED: 
          message = "Downloads are denied"; 
          break; 
         case OUT_OF_MEMORY: 
          message = "Out Of Memory error"; 
          break; 
         case UNKNOWN: 
          message = "Unknown error"; 
          break; 
         } 
         Toast.makeText(getBaseContext(), message, 
           Toast.LENGTH_SHORT).show (); 

         spinner.setVisibility(View.GONE); 
        } 

        @Override 
        public void onLoadingComplete(String imageUri, 
          View view, Bitmap loadedImage) { 
         spinner.setVisibility(View.GONE); 
        } 
       }); 

    container.addView(phView, LayoutParams.MATCH_PARENT, 
      LayoutParams.MATCH_PARENT); 
     return phView; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view.equals(object); 
    } 

    @Override 
    public void restoreState(Parcelable state, ClassLoader loader) { 
    } 

    @Override 
    public Parcelable saveState() { 
     return null; 
    } 

    @Override 
    public void startUpdate(View container) { 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.splash, menu); 
    return true; 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    overridePendingTransition(R.anim.fadein, R.anim.fadeout); 
    UILPager.this.finish(); 
} 
} 

Я был прав. Все волшебство, которое нужно было настроить, находится в instantiateItem().

+0

спас мой день :) – codevscolor

Смежные вопросы