我有一个像这样的图像 - >
我希望像这样展示 - >
然后我可以选择我能看到多少(0~1,0 =看不到,1 =整个图片,0.5 =半图片,等等,从用户输入读取)
怎么做?
我尝试使用android:scaleType
,但它无效。
答案 0 :(得分:22)
我最好的建议是将BitmapDrawable换成ClipDrawable。
ClipDrawable允许您为任何其他drawable定义剪裁,因此不会绘制整个drawable,而只会绘制其中的一部分。
那怎么办?您的ImageView可以显示可绘制的 - 可通过setImageDrawable()
指定。当然,您可以在其中放置图像位图的BitmapDrawable。如果你首先使用ClipDrawable包装你的BitmapDrawable,然后只分配给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" />
您可以通过调用ClipDrawable(setLevel()
)上的函数clip_source
来定义裁剪量。级别0表示图像完全隐藏,级别10000表示图像完全显示。您可以在中间使用任何int值。
您必须在代码中设置级别,因此您的代码应该首先获得对ClipDrawable的引用。您可以通过在ImageView实例上运行getDrawable()
来执行此操作。当你有一个ClipDrawable的引用时,只需在它上面运行setLevel(5000)
(或任何其他数字0-10000)。
ImageView img = (ImageView) findViewById(R.id.imageView1);
mImageDrawable = (ClipDrawable) img.getDrawable();
mImageDrawable.setLevel(5000);
答案 1 :(得分: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);
根据需要设置高度..
享受:)
答案 2 :(得分:2)
我通过在标记中设置我的ImageView上的scrollY来实现这一点。从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>
所以,从我的例子来看,它只显示图标的下半部分。
答案 3 :(得分:0)
这是一种简单的方法..在主布局中为您的图像创建单独的布局。确保它是真实的。现在将图片的图像视图放在布局的旁边,并使其填充父级。现在确定制作一个空白图像,并将该图像视图添加到布局的底部,并将顶部添加到布局的中心。只是弄乱图像视图的边距和大小,直到它看起来像你想要的方式。希望这会有所帮助。
答案 4 :(得分:0)
将您的drawable转换为位图并裁剪以获得图像的顶部以形成另一个位图,然后将其显示在图像视图中。
// to convert drawable to bitmap
Bitmap resource = BitmapFactory.decodeResource(context.getResources(),
R.drawable.your_resource);
// to set width of bitmap to imageview's width if necessary,
int width = imageView.getMeasuredWidth();
// to crop the bitmap to specific width and height,
resource = Bitmap.createBitmap(resource, 0, 0, width, height);
答案 5 :(得分:0)
这是将图像裁剪为两部分的代码
public static Bitmap getScaleBitmap(Bitmap bitmap, int check) {
final Bitmap toBeCropped = bitmap;
final BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inTargetDensity = 1;
toBeCropped.setDensity(Bitmap.DENSITY_NONE);
int top = 0;
int bottom = 0;
int targetheight = 0;
if (check == 0) {// return 1st half of image
top = 0;
bottom = bitmap.getHeight() / 2;
} else {// return 2nd half of image
top = (bitmap.getHeight() / 2) - 10;
bottom = (bitmap.getHeight() / 2) - 10;
}
int fromHere = (int) (toBeCropped.getHeight() * 0.5);
Bitmap croppedBitmap = Bitmap.createBitmap(toBeCropped, 0, top, toBeCropped.getWidth(), bottom);
return croppedBitmap;
}