0

Я пишу галерею изображений с горизонтальной прокруткой. Изображения должны быть добавлены программно. Я использую пользовательский горизонтальный вид прокрутки для обработки и добавления изображения, как показано в следующем коде:Простая галерея изображений с HorizontalScrollView

public void setViewList(Integer linearLayoutId, Integer[] imageIdList, 
          Activity activity) { 

    displayMetrics = ImageUtils.getDisplayMetric(activity); 

    LinearLayout ll = (LinearLayout) findViewById(linearLayoutId); 
    for (Integer imgId : imageIdList) { 
     ImageView imageView = new ImageView(getContext()); 

     imageView.setImageResource(imgId); 
     imageView.setScaleType(ImageView.ScaleType.MATRIX); 

     Integer[] displayMetrics = ImageUtils.getDisplayMetric(activity); 
     ImageUtils.scaleImage(imageView, displayMetrics[0], displayMetrics[1]); 

     Integer[] dstDimension = ImageUtils.createDimension(); 
     ImageUtils.getImageSize(imageView, dstDimension); 
     getImageSizeList().add(dstDimension); 

     ll.addView(imageView); 
    } 

} 

Как вы можете видеть я масштабировать изображение с использованием следующего метода (назовем ImageUtils.scaleImage(imageView, displayMetrics[0], displayMetrics[1])):

public static void scaleImage(ImageView imView, int screenWidth, int screenHeight) { 
    Drawable temp = imView.getDrawable(); 

    Bitmap imBitmap = ((BitmapDrawable)temp).getBitmap(); 

    int imWidth = imBitmap.getWidth(); 
    int imHeight = imBitmap.getHeight(); 

    float xScale = ((float) screenWidth)/imWidth; 
    float yScale = ((float) screenHeight)/imHeight; 

    float scale = xScale <= yScale ? xScale : yScale; 
    Matrix scaleMatrix = new Matrix(); 
    scaleMatrix.postScale(scale, scale); 

    Bitmap scBitmap = Bitmap.createBitmap(imBitmap, 0, 0, imWidth, imHeight, scaleMatrix, true); 

    BitmapDrawable scDrBitmap = new BitmapDrawable(imView.getResources(), scBitmap); 
    imView.setImageDrawable(scDrBitmap); 
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
     ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT 
    ); 

    layoutParams.gravity = Gravity.CENTER; 

    imView.setLayoutParams(layoutParams); 
} 

Мой макет main.xml довольно прост:

<?xml version="1.0" encoding="utf-8"?> 
<android.lessons.custom_horizontal_scroll.CustomHorizontalScrollView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/horizontalScrollView" 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     > 
    <LinearLayout android:orientation="horizontal" 
        android:id="@+id/mainLayout" 
        android:layout_gravity="center" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"/> 
</android.lessons.custom_horizontal_scroll.CustomHorizontalScrollView> 

Где android.lessons.custom_horizontal_scroll.CustomHorizontalScrollView является реали с помощью простого пользовательского HorizontalScrollView.

Для тестирования я использую Samsung Galaxy S3 и изображения со следующим разрешением: (1) 1290 * 990 (2) 1221 * 900. Как это выглядит:

enter image description here

Во многих случаях все отображается нормально, но время от времени я получаю неправильный результат: первое изображение делит экран со следующими один в приложении времени начала и я не» Подумайте, почему это происходит.

Спасибо за помощь.

ответ

0

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

Вот как использовать его https://developer.android.com/training/animation/screen-slide.html.

+0

Да! Это работает. Большое спасибо. Но вопрос остается открытым :) – ilya8891

0

Проблема решена с использованием силы тяжести = Gravity.FILL_HORIZONTAL | Gravity.CENTER_VERTICAL, который я программно представляю на изображении (метод ImageUtils.scaleImage).

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