(Android) Как показать часть изображения?

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

enter image description here

И я хочу показать это →

enter image description here

Затем я могу выбрать, сколько я могу видеть (0 ~ 1,0 = не может видеть, 1 = Всего картинка, 0.5 = половина изображения,.... и т.д., чтение с пользовательского ввода)

Как это сделать?

Я пытался использовать android:scaleType, но он не работает.

Ответы

Ответ 1

Мое лучшее предложение - обернуть BitmapDrawable с ClipDrawable.

ClipDrawable позволяет вам определять обрезку для любых других доступных для рисования, поэтому вместо рисования всего рисунка будет нарисована только часть его.

Как это будет работать? Ваш ImageView может отображать выделение с возможностью рисования через setImageDrawable(). Естественно, вы разместили бы BitmapDrawable вашего растрового изображения. Если вы сначала закроете BitmapDrawable с помощью ClipDrawable и только затем назначьте ImageView, вы должны быть в порядке.

<ImageView
        android:id="@+id/imageView1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/clip_source" />

и это clip_source drawable:

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:clipOrientation="vertical"
    android:drawable="@drawable/your_own_drawable"
    android:gravity="top" />

Вы можете определить размер обрезки, вызвав функцию setLevel() в ClipDrawable (clip_source). Уровень 0 означает, что изображение полностью скрыто, а уровень 10000 означает, что изображение полностью раскрыто. Вы можете использовать любое значение int в середине.

Вам нужно будет установить уровень в коде, поэтому ваш код должен сначала получить ссылку на ClipDrawable. Вы можете сделать это, выполнив getDrawable() в вашем экземпляре ImageView. Когда у вас есть ссылка на ваш ClipDrawable, просто запустите setLevel(5000) на нем (или любом другом номере 0-10000).

ImageView img = (ImageView) findViewById(R.id.imageView1);
mImageDrawable = (ClipDrawable) img.getDrawable();
mImageDrawable.setLevel(5000);

Ответ 2

вот еще один способ добиться этого.

public static Bitmap getScaleBitmap(Bitmap bitmap) {

        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
        bitmap.getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()/2);
        final RectF rectF = new RectF(rect);
        final float roundPx = 0;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);

    return output;
}

Здесь внизу строки

final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()/2);

установите высоту, как вам нужно.

Наслаждайтесь:)

Ответ 3

Вот простой способ. Создайте отдельный макет в своем основном макете только для ваших изображений. Убедитесь, что это реально. Теперь поместите изображение для ваших изображений в сторону макета и заставьте его заполнить родительский элемент. Теперь OK сделайте пустое изображение и добавьте этот вид изображения в нижней части макета и сверху в центр макета. Просто беспорядок с полями и размером изображений, пока он не будет выглядеть так, как вы хотите. Надеюсь, это поможет.

Ответ 4

Я достиг этого, установив scrollY на моем ImageView в разметке. Из документации по android, очевидно, это не вариант, если вы имеете дело с устройствами, использующими меньше API 14. Кроме того, в моем случае я использую изображения фиксированного размера, которые загружаются на основе состояния приложения, поэтому они всегда одного размера. Таким образом, я могу просто реализовать его в разметке. Я понимаю, что этот подход не будет работать для всех.

Я обертываю изображение в макете, которая в два раза больше, чем значок, и намеренно имеет размер значка в его фактическом размере. Без набора scrollY он отображает только верхнюю половину изображения. Установка scrollY перемещает его туда, где я хочу - отображать только нижнюю половину изображения.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="horizontal"
    android:gravity="center_horizontal">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/default_icon"
        android:scrollY="50dp" />

</LinearLayout>

Итак, из моего примера, он отображает только нижнюю половину значка.

Ответ 5

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

// to convert  drawable to bitmap
Bitmap resource = BitmapFactory.decodeResource(context.getResources(),
                                           R.drawable.your_resource);
// to set width of bitmap to imageview width if necessary,
                        int width = imageView.getMeasuredWidth();
// to crop the bitmap to specific width and height,
                            resource = Bitmap.createBitmap(resource, 0, 0, width, height);