旋转ImageView及其背景而不裁剪

7
我一直在寻找解决方法,但是我不能使用android:rotation,因为我希望这个应用程序与Android API 11版本以下的设备兼容。我的问题类似于这个问题:在Android中旋转视图 我已经做了以下工作:
@Override
public void draw(Canvas canvas) {
    canvas.save();
    Drawable d = getDrawable();
    canvas.rotate(-10, d.getIntrinsicWidth() / 2, d.getIntrinsicHeight() / 2);
    super.draw(canvas);
    canvas.restore();
}

ImageView是RelativeLayout的一部分,我在其中放置图像和一些文本。

但是,图像在边缘被裁剪。我该如何避免这种情况?

2个回答

8

你只需要添加:

android:clipChildren="false"

将其添加到父级ViewGroup中。

例如:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:clipChildren="false">
    <com.yourcompany.views.RotateImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="@android:color/white"
        android:src="@drawable/ic_launcher" />
</FrameLayout>

旋转图片视图:

public class RotateImageView extends ImageView {
    @Override
    public void draw(Canvas canvas) {
         canvas.save();
         int height = canvas.getHeight();
         int width = canvas.getWidth();
         canvas.rotate(45, height / 2, width / 2);
         super.draw(canvas);
         canvas.restore();
    }
}

在API Level 11之前,提供了一种简洁的解决方案。

1
你的剪辑子元素在这里没有起作用,而是你的300dp高度起了作用:\ - Zahan Safallwa
你用 API 级别小于 11 的版本测试过吗?因为答案明确说明,它将为较低的 API 级别提供解决方案。 - Murmel

0

尝试将您的ImageView作为FrameLayout的子视图添加,并将FrameLayout的宽度和高度设置为与您的ImageView相同。查看我的类似答案这里。原始答案来自Pavlo Viazovskyy的帖子这里。希望这可以帮助到您!


谢谢您的回复,我最终做的有点棘手,只是在绘图中进行了一些缩放:canvas.scale(0.9f, 0.9f, d.getIntrinsicWidth()/2, d.getIntrinsicHeight()/2); 但我会记住您的建议。 - nutshell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接