2014-06-06 39 views
0

我使用ViewFlipper为我的应用程序构建了图像旋转木马,但设备上存储的图像质量非常差。我已经使用了以下内容:使用decodeSampledBitmapFromResource的图像质量差,无论如何,以改善?

String fileLoc = mediaData.get("fileLoc"); 
ImageView imageItem = new ImageView(getApplicationContext()); 
InputStream imageStream = null; 
try { 
    File file = new File(fileLoc); 
    imageStream = new FileInputStream(file); 
    imageItem.setImageBitmap(Configurator.decodeSampledBitmapFromResource(getResources(), fileLoc, 100, 100)); 
} catch... 

记忆是一个问题,因为有可能是任何数量的显示图像。

我没有发现这样的:

Resource to bitmap conversion results in poor quality

但我不能看到如何将其翻译为我的处境。

每@Ultimo_m,这里是需要采取什么措施的细节:

  1. 用户呈现具有基于选择上述选项三个部分的屏幕:PDF文档,图片和视频。
  2. 用户从显示
  3. 用户被引导到一个屏幕,显示所选择的项目
  4. 向右滑动从右到左的设定的图像显示,所述下一图像设定
  5. 刷卡从左至右示出了在集

眼下以前的形象我使用的是ViewFlipper:

  1. 我通过通过每个图像的位置的数组SharedPreference
  2. 我还
  3. 我遍历数组传递当前图像的关键位置来构建ViewFlipper
  4. 我使用当前键设定当前视图升降舵

使用如何从@Ultimo_m中选择图书馆如何告诉图书馆当前的图片以及下一张和上一张图片的内容?

----- -----编辑

Univeral Image loader从以前的屏幕敲击时,在当前图像上工作。我无法在文档中找到如何处理滑动事件,并告诉图书馆接下来要显示的内容。有关正在进行的滑动事件的图书馆github的屏幕截图,但我该如何利用它?

-----编辑-----

应用程序崩溃。投掷NullPointer在imageLoadView.setAdapter(new ImagePagerAdapter(imageArraySet));。我已经按照您的指定制作了xml文件。我确实对代码进行了调整,以从SharedPref中获取我的数组,我已经编写了我传递的数组(imageArraySet),并且该数组是正确的。我将代码粘贴后完整的错误日志:

public class Viewer extends baseActivity { 

    clientDB clientDB = new ClientDB(this); 

    public static final String PREFS_NAME = "myPrefs"; 
    SharedPreferences storedInfo; 

    String chosenImg; 

    ViewPager imageLoadView; 

    DisplayImageOptions options; 

    String[] imageArraySet; 

    //LoadImageUtil mLoadImageUtil; 
    private static final String STATE_POSITION = "STATE_POSITION"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_viewer); 

     Bundle bundle = getIntent().getExtras(); 
     assert bundle != null; 

     storedInfo = getSharedPreferences(PREFS_NAME,0); 
     String mediaID = storedInfo.getString("imgId", null); //ids of all passed images 
     String chosenImg = storedInfo.getString("chosenImg", null); //id of current image 

     String[] imageArray = mediaID.split(","); 
     imageArraySet = clientDB.getMediaDataSet(imageArray); 
     int pagerPosition = 0; 

     imageLoadView = (ViewPager) findViewById(R.id.imageLoadView); 
     imageLoadView.setAdapter(new ImagePagerAdapter(imageArraySet)); 
     imageLoadView.setCurrentItem(pagerPosition); 


    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     outState.putInt(STATE_POSITION, imageLoadView.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) { 
      container.removeView((View) object); 
     } 

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

     @Override 
     public Object instantiateItem(ViewGroup view, int position) { 
      View imageLayout = inflater.inflate(R.layout.item_pager_image, view, false); 
      assert imageLayout != null; 
      ImageView imageView = (ImageView) imageLayout.findViewById(R.id.image); 
      final ProgressBar spinner = (ProgressBar) imageLayout.findViewById(R.id.loading); 

      imageLoader.displayImage(images[position], imageView, 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(ImagePagerActivity.this, message, Toast.LENGTH_SHORT).show(); 

        spinner.setVisibility(View.GONE); 
       } 

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

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



} 

错误日志:

6-12 16:41:30.455: W/dalvikvm(19960): threadid=1: thread exiting with uncaught exception (group=0x41fdfe10) 
06-12 16:41:30.455: E/AndroidRuntime(19960): FATAL EXCEPTION: main 
06-12 16:41:30.455: E/AndroidRuntime(19960): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.client.clientconfigurator/com.client.clientconfigurator.Viewer}: java.lang.NullPointerException 
06-12 16:41:30.455: E/AndroidRuntime(19960): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2245) 
06-12 16:41:30.455: E/AndroidRuntime(19960): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2295) 
06-12 16:41:30.455: E/AndroidRuntime(19960): at android.app.ActivityThread.access$700(ActivityThread.java:150) 
06-12 16:41:30.455: E/AndroidRuntime(19960): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1280) 
06-12 16:41:30.455: E/AndroidRuntime(19960): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-12 16:41:30.455: E/AndroidRuntime(19960): at android.os.Looper.loop(Looper.java:176) 
06-12 16:41:30.455: E/AndroidRuntime(19960): at android.app.ActivityThread.main(ActivityThread.java:5279) 
06-12 16:41:30.455: E/AndroidRuntime(19960): at java.lang.reflect.Method.invokeNative(Native Method) 
06-12 16:41:30.455: E/AndroidRuntime(19960): at java.lang.reflect.Method.invoke(Method.java:511) 
06-12 16:41:30.455: E/AndroidRuntime(19960): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
06-12 16:41:30.455: E/AndroidRuntime(19960): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
06-12 16:41:30.455: E/AndroidRuntime(19960): at dalvik.system.NativeStart.main(Native Method) 
06-12 16:41:30.455: E/AndroidRuntime(19960): Caused by: java.lang.NullPointerException 
06-12 16:41:30.455: E/AndroidRuntime(19960): at com.client.clientconfigurator.Viewer.onCreate(Viewer.java:92) 
06-12 16:41:30.455: E/AndroidRuntime(19960): at android.app.Activity.performCreate(Activity.java:5267) 

回答

1

我建议你使用Universal Image Loader,它采用异步图像加载,缓存和显示,那里你可以找到实例如何实现它。做完之后,您不必关心图像的数量。

在这里,我给你一个例子,如何使用它:

首先创建此LoadImageUtil.class

public class LoadImageUtil { 

    protected ImageLoader imageLoader = ImageLoader.getInstance(); 
    DisplayImageOptions options; 
    public boolean memoryManage(int item) {// use this to clear cache 
     switch (item) { 
      case 0: 
       imageLoader.clearMemoryCache(); 
       return true; 
      case 1: 
       imageLoader.clearDiscCache(); 
       return true; 
      default: 
       return false; 
     } 
    } 

    public LoadImageUtil(Context mContext) { 
     initUILSettings(mContext); 
    } 

    public void initUILSettings(Context mContext){ 

     imageLoader.init(ImageLoaderConfiguration.createDefault(mContext)); 

     options = new DisplayImageOptions.Builder() 
       .showImageOnLoading(R.drawable.calice) 
       .showImageForEmptyUri(R.drawable.calice) 
       .showImageOnFail(R.drawable.calice) 
       .cacheInMemory(true) 
       .cacheOnDisc(true) 
       .considerExifParams(true) 
       .bitmapConfig(Bitmap.Config.RGB_565) 
       .build(); 

    } 

    public void loadBitmapToImageView(ImageView myImageView, String ImagePath) { 

     imageLoader.displayImage(ImagePath, myImageView, options, new SimpleImageLoadingListener() { 
      @Override 
      public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
       super.onLoadingComplete(imageUri, view, loadedImage); 

      } 

      @Override 
      public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
       // Log.e("onLoadingFailed : " + imageUri, "failReason: " + failReason); 

      } 

      @Override 
      public void onLoadingCancelled(String imageUri, View view) { 
       super.onLoadingCancelled(imageUri, view);     
      } 
     }); 
    } 
} 

从你的类,你要加载的图片做:

LoadImageUtil mLoadImageUtil = new LoadImageUtil(getApplicationContext()); 

第三要加载将这个图片:

mLoadImageUtil.loadBitmapToImageView(YourImageView, ImagePathOrUrl); 

在这里你有,你应该在方法通过加载图像imagesPath的例子

String imageUri = "http://8.8.8.8/image.png"; // from Web 
String imageUri = "file:///mnt/sdcard/image.png"; // from SD card 
String imageUri = "content://media/external/audio/albumart/13"; // from content provider 
String imageUri = "assets://image.png"; // from assets 
String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch) 

编辑:

在我看来,如果你使用ViewPager来解决你的问题将是最好的,下面我会告诉你一些代码如何做到这一点基于图书馆我到LD你:

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

    private static final String STATE_POSITION = "STATE_POSITION"; 


    ViewPager pager; 
    LoadImageUtil mLoadImageUtil; 

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

      // in this example the data are passed to this activity using bundle 
     Bundle bundle = getIntent().getExtras(); 
     assert bundle != null; 

      // imageUrls is the array that contains the images URL to load 
     String[] imageUrls = bundle.getStringArray(Extra.IMAGES); 

     int pagerPosition = bundle.getInt(Extra.IMAGE_POSITION, 0); 

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

      mLoadImageUtil = new LoadImageUtil(getApplicationContext()); 


     pager = (ViewPager) findViewById(R.id.pager); 
     pager.setAdapter(new ImagePagerAdapter(imageUrls)); 
     pager.setCurrentItem(pagerPosition); 
    } 

    @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) { 
      container.removeView((View) object); 
     } 
      // the view pager will have the same number of pages as the length of the Strings array 
     @Override 
     public int getCount() { 
      return images.length; 
     } 

     @Override 
     public Object instantiateItem(ViewGroup view, int position) { 
      View imageLayout = inflater.inflate(R.layout.item_pager_image, view, false); 
      assert imageLayout != null; 
      ImageView imageView = (ImageView) imageLayout.findViewById(R.id.image); 
       // here is the part where image is load for each pager 
       mLoadImageUtil.loadBitmapToImageView(imageView, images[position]); 

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

下面是XML文件:

ac_image_pager.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/pager" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

item_pager_image.xml

<?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/image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:adjustViewBounds="true" 
     android:contentDescription="@string/descr_image" /> 

</FrameLayout> 
+0

我在一点点时间紧迫,客户喜欢目前的功能只要提高图像质量即可。我可以在上述代码中做什么,或者我可以通过调整来解决这个问题? – dcp3450

+0

我试图使用建议的库,但无法弄清楚如何让它与我的查看器屏幕一起工作。我需要将它传递给当前图像,并且我假设分配下一个和前一个图像(?) – dcp3450

+0

请参阅我编辑的答案 –