(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);