正确旋转ImageView和FrameLayout

时间:2015-11-19 10:04:16

标签: android rotation imageview android-framelayout image-rotation

我在 FrameLayout 中都有一个Imageview(两者都有 Layout_margins ),我也得到了自定义的FrameLayout(与 Layout_margins 相同)。<登记/> 那么我现在拥有的:
Source
源代码(.axml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffff363c"
    android:layout_weight="100"
    android:clickable="true">
    <FrameLayout
        android:id="@+id/MainFrameLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_gravity="center"
        android:layout_weight="80">
        <FrameLayout
            android:id="@+id/SourceFrame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:layout_margin="10dp">
            <ImageView
                android:src="@android:drawable/ic_menu_camera"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/Img"
                android:layout_margin="10dp" />
        </FrameLayout>
        <CustomFrameLayout
            android:id="@+id/CustomView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="invisible"
            android:layout_margin="10dp" />
    </FrameLayout>
</LinearLayout>  

我想要的是什么(以编程方式向左旋转,向右旋转按钮):
MyGoal

所以我的主要目标是旋转正确的图像(以及CustomFrameLayout),我也需要存储我的图像源宽度/高度。我怎么能实现这一点?
我试着设置scaleType.center / scaletype.centerInisde,但这是错误的想法 有什么建议?谢谢!

2 个答案:

答案 0 :(得分:1)

不知道我是否完全理解你的问题。 如果你想以编程方式旋转某些东西你可以试试这个:

ImageView image.animate().rotation(90).start();

或者

FrameLayout frame.animate().rotation(90).start();

或两者兼而有之。 要存储宽度/高度,您可以使用

int image_h = image.getHeight();
int image_w = image.getWidth();

答案 1 :(得分:0)

迟到总比没有好。

我遇到了完全相同的问题。 经过一番尝试,我得到了这个解决方案:

private void rotateImageBy90(){
    imageView.animate()
            .rotation(90)
            .setInterpolator(new AccelerateDecelerateInterpolator())
            .setDuration(250)
            .setListener(rotateListener)
            .start();
    Log.d("chatImage", "Rotating image by "+90+" degrees clockwise");
}

声明一个解决问题的AnimatorListener:

Animator.AnimatorListener rotateListener = new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animator) {

    }

    @Override
    public void onAnimationEnd(Animator animator) {
        FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) imageView.getLayoutParams();
        params.height = FrameLayout.LayoutParams.MATCH_PARENT;
        params.width = FrameLayout.LayoutParams.MATCH_PARENT;
        imageView.setLayoutParams(params);
        imageView.requestLayout();

        //This is the trick: I get the current bitmap, rotate it 
        Bitmap newBitmap = rotateImage(((BitmapDrawable)imageView.getDrawable()).getBitmap(),90);
        //Then, rotate the imageview back to it's original position, without animation
        imageView.setRotation(0);
        //As I set the new, rotate bitmap, to it.
        imageView.setImageBitmap(newBitmap);
    }

    @Override
    public void onAnimationCancel(Animator animator) {

    }

    @Override
    public void onAnimationRepeat(Animator animator) {

    }
};

rotateImage方法:

public static Bitmap rotateImage(Bitmap source, float angle) {
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix,
            true);
}