7

I've been searching a lot, but I can't get a solution for my problem. I can't use android:rotation as I want this app to be compatible with Android API under 11 version. My problem is something similar to this: Rotating a view in Android

I've done this:

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

The ImageView is part of a RelativeLayout where I place the image and some text.

But the image is cropped in the edges. How can I avoid that?

Chris Stillwell
  • 10,266
  • 10
  • 67
  • 77
nutshell
  • 113
  • 2
  • 7

2 Answers2

8

You simply have to add:

android:clipChildren="false"

to the parent ViewGroup.

For Example:

<?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>

RotateImageView:

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

Which provides a clean solution before API Level 11

Murmel
  • 5,402
  • 47
  • 53
0

Try adding your ImageView as a child view of a FrameLayout and set the FrameLayouts width and height the same as that of your ImageView. View my similar answer here. Original answer relayed from a post by Pavlo Viazovskyy here. Hope this helps!

Community
  • 1
  • 1
egg-hunter
  • 21
  • 2
  • Thank you for your response, what I finally did was a little tricky, just do some scale inside draw: canvas.scale(0.9f, 0.9f, d.getIntrinsicWidth()/2, d.getIntrinsicHeight()/2); But I'll keep in mind your option. – nutshell May 10 '13 at 16:54