(Android)如何显示图像的一部分?

时间:2013-08-06 06:58:47

标签: android image

我有一个像这样的图像 - >

enter image description here

我希望像这样展示 - >

enter image description here

然后我可以选择我能看到多少(0~1,0 =看不到,1 =整个图片,0.5 =半图片,等等,从用户输入读取)

怎么做?

我尝试使用android:scaleType,但它无效。

6 个答案:

答案 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;


}