我有这样的图像->
我想像这样展示->
然后我可以选择我能看到多少(0~1,0=看不到,1=整张图片,0.5=半张图片,....等,从用户输入读取)
怎么做?
我尝试使用android:scaleType
,但它不工作。
我最好的建议是用 ClipDrawable 包装你的BitmapDrawable。
ClipDrawable 允许您为任何其他可绘制对象定义剪辑,因此不会绘制整个可绘制对象,而只会绘制其中的一部分。
那将如何运作?您的 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
可绘制的:
<?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);
这是实现这一目标的另一种方法
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);
根据需要设置高度..
享受 :)
我通过在标记中的 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>
因此,在我的示例中,它只显示图标的下半部分。
这是一个简单的方法。在您的主布局中为您的图像创建一个单独的布局。确保它是真实的。现在将您的图片的图像视图放在布局的一侧并使其填充父级。好的,现在制作一个空白图像并将该图像视图添加到布局的底部,并将顶部添加到布局的中心。只是弄乱图像视图的边距和大小,直到它看起来像你想要的那样。希望这可以帮助。
这是将图像裁剪成两部分的代码
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;
}
将您的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);