毫不拖延地滑动大图像

时间:2015-11-06 06:46:42

标签: android photoswipe

我开发了一个具有滑动图像功能的图库应用程序(向左/向右拖动并显示新的全屏图像)。 问题是我没有成功克服大图像的小延迟,直到它们出现(whatsapp图像 - 没问题,相机图像不像内置图库应用程序那样平滑)。 我尝试了几种方法来重新调整图像大小/解码,但仍有延迟。

我的代码:

FullScreenImageAdapter.java

public class FullScreenImageAdapter extends PagerAdapter {

private Activity _activity;
private ArrayList<String> _imagePaths;
private LayoutInflater inflater;
private final int IMAGE_MAX_SIZE = 800;

// constructor
public FullScreenImageAdapter(Activity activity,
                              ArrayList<String> imagePaths) {
    this._activity = activity;
    this._imagePaths = imagePaths;
}

@Override
public int getCount() {
    return this._imagePaths.size();
}

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

@Override
public Object instantiateItem(ViewGroup container, int position) {
    ImageView imgDisplay;

    inflater = (LayoutInflater) _activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, container,
            false);

    imgDisplay = (ImageView) viewLayout.findViewById(R.id.imgDisplay);

    Bitmap bitmap = decodeSampledBitmapFromPath(_imagePaths.get(position),1000,1000);

    imgDisplay.setImageBitmap(bitmap);

    ((ViewPager) container).addView(viewLayout);

    return viewLayout;
}

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

}

public static Bitmap decodeSampledBitmapFromPath(String path, int reqWidth,
                                                 int reqHeight) {

    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(path, options);

    options.inSampleSize = calculateInSampleSize(options, reqWidth,
            reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    Bitmap bmp = BitmapFactory.decodeFile(path, options);
    return bmp;
}

public static int calculateInSampleSize(BitmapFactory.Options options,
                                        int reqWidth, int reqHeight) {

    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        if (width > height) {
            inSampleSize = Math.round((float) height / (float) reqHeight);
        } else {
            inSampleSize = Math.round((float) width / (float) reqWidth);
        }
    }
    return inSampleSize;
}

}

FullScreenViewActivity.java

public class FullScreenViewActivity extends Activity{

private FullScreenImageAdapter adapter;
private ViewPager viewPager;
int selectedFilePosition;
String imageFolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_full_screen_view);

    //geting the selected image from the intent
    /* Getting ImageURI from Gallery from Main Activity */
    Uri selectedImgUri = getIntent().getData();
    if (selectedImgUri!=null) {
        imageFolder = getRealPathFromURI(this, selectedImgUri);
    }

    viewPager = (ViewPager) findViewById(R.id.pager);

    adapter = new FullScreenImageAdapter(FullScreenViewActivity.this, getFilePaths(imageFolder));

    viewPager.setAdapter(adapter);

    // displaying selected image first
    viewPager.setCurrentItem(selectedFilePosition);
}

// Reading file paths from SDCard
public ArrayList<String> getFilePaths(String selectedFilePath) {
    ArrayList<String> filePaths = new ArrayList<String>();

    File file = new File(selectedFilePath);
    File directory = file.getParentFile();

    // check for directory
    if (directory.isDirectory()) {
        // getting list of file paths
        File[] listFiles = directory.listFiles();

        // Check for count
        if (listFiles.length > 0) {
                // loop through all files
                for (int i = 0; i < listFiles.length; i++) {
                    // get file path
                    String filePath = listFiles[i].getAbsolutePath();
                    //set position if this is the required image to show
                    if (filePath.equals(selectedFilePath)) {
                        selectedFilePosition = i;
                        // Add image path to array list
                        filePaths.add(filePath);
                    }
                }
        }

    }
    return filePaths;
}

public String getRealPathFromURI(Context context, Uri contentUri) {
    Cursor cursor = null;
    try {
        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

}

2 个答案:

答案 0 :(得分:1)

要提高性能,您需要另一个线程来加载异步。以下是处理大型图片时可以使用的第三方库(PicassoGlide)。

答案 1 :(得分:1)

我也会使用Picasso将图像加载到ImageView中。 Picasso缓存图像,如果它已加载一次。要预加载一些元素,您可以使用Consumner / Producer Pattern!示例here