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