Android旋转xml而不进行任何调整大小

时间:2014-02-05 11:10:55

标签: android android-layout android-xml rotateanimation

我有一个活动,这是它的布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:background="@drawable/main_background" >

</RelativeLayout>

main_background是一个旋转xml。每个方向都有两个main_background xml

drawable-hdpi / main_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android" 
    android:drawable="@drawable/sss" >
</rotate>

drawable-land-hdpi / main_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android" 
    android:fromDegrees="90"
    android:toDegrees="90"
    android:drawable="@drawable/sss" >
</rotate>

所以我想使用相同的.jpg文件,但水平和垂直方向的旋转不同。例如,当方向更改为水平时,我想将可绘制的90度旋转。但这是我的结果:

垂直方向(这没有问题):

Vertical orientation

水平方向(这是我的问题):

Horizontal orientation

我想要什么(没有任何调整大小):

What i want

我该怎么做?

2 个答案:

答案 0 :(得分:0)

也许使用两个布局文件夹(layout-land,layout-port)并简单地添加

android:rotation="90"

到您的版本的布局(实际上,使用图像作为资源的视图)

您可能还需要使用layout-width和layout-height条目。

或者,您可以使用视图方法.rotatef()和.scalef();

以编程方式执行此操作。

答案 1 :(得分:0)

afaik你不能在xml中做到这一点,唯一的方法是创建一个自定义类来扩展Drawable,它会对orientarion的变化作出反应,例如:

class D extends Drawable {
    private Bitmap mBitmap;
    private Matrix mMatrix;
    private boolean mIsLandscape;

    public D(Resources res, Bitmap b) {
        mBitmap = b;
        mMatrix = new Matrix();
        mIsLandscape = res.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
    }

    @Override
    protected void onBoundsChange(Rect bounds) {
        RectF src = new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
        RectF dst = new RectF();
        if (!mIsLandscape) {
            dst.set(0, 0, bounds.width(), bounds.height());
        } else {
            dst.set(0, 0, bounds.height(), bounds.width());
        }
        mMatrix.setRectToRect(src, dst, ScaleToFit.FILL);
        if (mIsLandscape) {
            mMatrix.postRotate(-90);
            mMatrix.postTranslate(0, bounds.height());
        }
    }

    @Override
    public void draw(Canvas canvas) {
        canvas.drawBitmap(mBitmap, mMatrix, null);
    }

    @Override
    public void setAlpha(int alpha) {
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}