1c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li/*
2c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li * Copyright (C) 2010 The Android Open Source Project
3c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li *
4c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License");
5c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li * you may not use this file except in compliance with the License.
6c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li * You may obtain a copy of the License at
7c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li *
8c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li *      http://www.apache.org/licenses/LICENSE-2.0
9c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li *
10c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li * Unless required by applicable law or agreed to in writing, software
11c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS,
12c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li * See the License for the specific language governing permissions and
14c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li * limitations under the License.
15c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li */
16c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li
17c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Lipackage com.android.camera.ui;
18c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li
19c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Liimport android.content.Context;
20c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Liimport android.util.AttributeSet;
21c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Liimport android.view.View;
22c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Liimport android.view.ViewGroup;
23c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li
24c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li// A RotateLayout is designed to display a single item and provides the
25c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li// capabilities to rotate the item.
2694ca8baae7e6e3885d895c095890eabf30d922e2Chih-yu Huangpublic class RotateLayout extends ViewGroup implements Rotatable {
27750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li    private static final String TAG = "RotateLayout";
28c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    private int mOrientation;
29c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    private View mChild;
30c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li
31c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    public RotateLayout(Context context, AttributeSet attrs) {
32c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        super(context, attrs);
33d4832351874aa6eb2cd5e312c21bd4ec607ff3a4Wu-cheng Li        // The transparent background here is a workaround of the render issue
34d4832351874aa6eb2cd5e312c21bd4ec607ff3a4Wu-cheng Li        // happened when the view is rotated as the device's orientation
35d4832351874aa6eb2cd5e312c21bd4ec607ff3a4Wu-cheng Li        // changed. The view looks fine in landscape. After rotation, the view
36d4832351874aa6eb2cd5e312c21bd4ec607ff3a4Wu-cheng Li        // is invisible.
37d4832351874aa6eb2cd5e312c21bd4ec607ff3a4Wu-cheng Li        setBackgroundResource(android.R.color.transparent);
38c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    }
39c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li
40c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    @Override
41c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    protected void onFinishInflate() {
42c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        mChild = getChildAt(0);
43750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li        mChild.setPivotX(0);
44750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li        mChild.setPivotY(0);
45c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    }
46c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li
47c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    @Override
48c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    protected void onLayout(
49c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li            boolean change, int left, int top, int right, int bottom) {
50c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        int width = right - left;
51c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        int height = bottom - top;
52c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        switch (mOrientation) {
53c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li            case 0:
54c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li            case 180:
55c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li                mChild.layout(0, 0, width, height);
56c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li                break;
57c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li            case 90:
58c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li            case 270:
59c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li                mChild.layout(0, 0, height, width);
60c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li                break;
61c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        }
62c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    }
63c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li
64c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    @Override
65c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    protected void onMeasure(int widthSpec, int heightSpec) {
66750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li        int w = 0, h = 0;
67c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        switch(mOrientation) {
68c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li            case 0:
69c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li            case 180:
70c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li                measureChild(mChild, widthSpec, heightSpec);
71750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li                w = mChild.getMeasuredWidth();
72750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li                h = mChild.getMeasuredHeight();
73c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li                break;
74c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li            case 90:
75c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li            case 270:
76c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li                measureChild(mChild, heightSpec, widthSpec);
77750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li                w = mChild.getMeasuredHeight();
78750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li                h = mChild.getMeasuredWidth();
79c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li                break;
80c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        }
81750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li        setMeasuredDimension(w, h);
82c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li
83c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        switch (mOrientation) {
84750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li            case 0:
85750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li                mChild.setTranslationX(0);
86750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li                mChild.setTranslationY(0);
87750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li                break;
88c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li            case 90:
89750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li                mChild.setTranslationX(0);
90750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li                mChild.setTranslationY(h);
91c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li                break;
92c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li            case 180:
93750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li                mChild.setTranslationX(w);
94750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li                mChild.setTranslationY(h);
95c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li                break;
96c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li            case 270:
97750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li                mChild.setTranslationX(w);
98750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li                mChild.setTranslationY(0);
99c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li                break;
100c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        }
101750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li        mChild.setRotation(-mOrientation);
102c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    }
103c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li
104c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    // Rotate the view counter-clockwise
105c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    public void setOrientation(int orientation) {
106c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        orientation = orientation % 360;
107c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        if (mOrientation == orientation) return;
108c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        mOrientation = orientation;
109c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li        requestLayout();
110c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li    }
111c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li}
112