Не могу изменить размер изображения в Android без потери содержимого

У меня есть несколько изображений размером 400х550 (шхх). Я хочу изменить их размер до 200 x 300, чтобы отобразить их в виде сетки двух столбцов. Но изображения не полностью вписываются в ImageView сетки.

например у меня есть это изображение

После изменения размера до 200 х 300, это выглядит в сетке

Как вы можете видеть, содержание не вписывается в изображение полностью.

Вот мои фрагменты кода.

frame_layout_gallery.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageViewGallery"
        android:layout_width="300dp"
        android:layout_height="200dp"
        android:scaleType="centerCrop"/>

</FrameLayout>

ImageAdapter:

public View getView(int position, View convertView, ViewGroup parent) {
    View grid;
    LayoutInflater inflater = (LayoutInflater) mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {

        grid = inflater.inflate(R.layout.frame_layout_gallery, null);
    } else {
        grid = (View) convertView;
    }

    ImageView imageView = (ImageView) grid.findViewById(R.id.imageViewGallery);
    Bitmap mBitmap = BitmapFactory.decodeResource(mContext.getResources(), imageSource[position]);
    Bitmap imageBitmap = Bitmap.createScaledBitmap(mBitmap, 200, 300, false);
    imageView.setImageBitmap(imageBitmap);
    return grid;
}

Я пробовал и другие варианты масштабирования изображения, но ни один из них, похоже, не работает.

лайк

public static Bitmap scaleDown(Bitmap realImage, float maxWidth, float maxHeight,
                               boolean filter) {
    float wRatio = (float) maxWidth / realImage.getWidth();
    float hRatio =  (float) maxHeight / realImage.getHeight();
    int width = Math.round((float) wRatio * realImage.getWidth());
    int height = Math.round((float) hRatio * realImage.getHeight());

    Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width,
            height, filter);
    return newBitmap;
}

1 ответ

Хорошо, я опубликую то, что я сделал, это в gridView и сделано для списка изображений, но вы можете легко адаптировать его.

PhotoScaleAdapter:

    public class PhotoScaleAdapter extends BaseAdapter {

    static class ViewHolder {
        ImageView image;
    }


    List<MediaFile> mListMedia;
    Context mContext;
    LayoutInflater mInflater;

    public PhotoScaleAdapter(Context context, List<MediaFile> mediaFiles){
        mContext = context;
        mListMedia = mediaFiles;
        mInflater =  LayoutInflater.from(mContext);
    }


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

    @Override
    public Object getItem(int position) {
        return mListMedia.get(position);
    }

    @Override
    public long getItemId(int position) {
        return mListMedia.get(position).getId();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        View view = convertView;
        ViewHolder holder = null;

        if (view == null) {
            view = mInflater.inflate(R.layout.scale_image, parent, false);
            holder = new ViewHolder();
            holder.image = (ImageView) view.findViewById(R.id.image);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }


        String path = mListMedia.get(position).getPath();

        Bitmap bitmap;
        bitmap = BitmapHelper.resizeBitmap(path, 400, 1);

        holder.image.setImageBitmap(bitmap);
        holder.image.setScaleType(ImageView.ScaleType.FIT_XY);
        holder.image.setAdjustViewBounds(true);

        if(mListMedia.get(position).isSelected()){
            LinearLayout linearLayout = (LinearLayout) holder.image.getParent();
            linearLayout.setBackgroundColor(mContext.getResources().getColor(R.color.colorAccent));
        }
        else{
            LinearLayout linearLayout = (LinearLayout) holder.image.getParent();
            linearLayout.setBackgroundColor(mContext.getResources().getColor(R.color.transparent));
        }


        return view;

    }
}

scale_image.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:padding="5dp"
             >

    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

и в заключительном упражнении / фрагменте… изображения находятся в gridView:

 <GridView
            android:id="@+id/grid_saisie_photo"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:numColumns="2"
            android:verticalSpacing="5dp"
            android:horizontalSpacing="5dp"
            android:stretchMode="columnWidth"
            android:choiceMode="singleChoice"
            android:drawSelectorOnTop="true"
            android:clickable="true"
            />
Другие вопросы по тегам