18872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/* 28872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Copyright (C) 2010 The Android Open Source Project 38872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 48872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 58872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * you may not use this file except in compliance with the License. 68872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * You may obtain a copy of the License at 78872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 88872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * http://www.apache.org/licenses/LICENSE-2.0 98872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Unless required by applicable law or agreed to in writing, software 118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * See the License for the specific language governing permissions and 148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * limitations under the License. 158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb */ 168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpackage com.android.camera.ui; 188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.content.Context; 208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.graphics.Matrix; 218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.util.AttributeSet; 228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.View; 238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.ViewGroup; 248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 252bca210e5fc8a77685775ffb403096167b017dceAngus Kongimport com.android.camera.debug.Log; 262bca210e5fc8a77685775ffb403096167b017dceAngus Kong 278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb// A RotateLayout is designed to display a single item and provides the 288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb// capabilities to rotate the item. 298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpublic class RotateLayout extends ViewGroup implements Rotatable { 308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @SuppressWarnings("unused") 312bca210e5fc8a77685775ffb403096167b017dceAngus Kong private static final Log.Tag TAG = new Log.Tag("RotateLayout"); 328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private int mOrientation; 338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private Matrix mMatrix = new Matrix(); 348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected View mChild; 358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public RotateLayout(Context context, AttributeSet attrs) { 378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb super(context, attrs); 388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // The transparent background here is a workaround of the render issue 398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // happened when the view is rotated as the device's orientation 408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // changed. The view looks fine in landscape. After rotation, the view 418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // is invisible. 428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb setBackgroundResource(android.R.color.transparent); 438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected void onFinishInflate() { 478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mChild = getChildAt(0); 48638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling mChild.setPivotX(0); 49638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling mChild.setPivotY(0); 508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected void onLayout( 548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb boolean change, int left, int top, int right, int bottom) { 558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int width = right - left; 568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int height = bottom - top; 578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb switch (mOrientation) { 588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb case 0: 598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb case 180: 608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mChild.layout(0, 0, width, height); 618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb break; 628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb case 90: 638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb case 270: 648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mChild.layout(0, 0, height, width); 658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb break; 668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected void onMeasure(int widthSpec, int heightSpec) { 718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int w = 0, h = 0; 728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb switch(mOrientation) { 738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb case 0: 748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb case 180: 758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb measureChild(mChild, widthSpec, heightSpec); 768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb w = mChild.getMeasuredWidth(); 778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb h = mChild.getMeasuredHeight(); 788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb break; 798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb case 90: 808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb case 270: 818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb measureChild(mChild, heightSpec, widthSpec); 828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb w = mChild.getMeasuredHeight(); 838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb h = mChild.getMeasuredWidth(); 848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb break; 858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb setMeasuredDimension(w, h); 878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 88638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling switch (mOrientation) { 89638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling case 0: 90638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling mChild.setTranslationX(0); 91638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling mChild.setTranslationY(0); 92638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling break; 93638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling case 90: 94638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling mChild.setTranslationX(0); 95638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling mChild.setTranslationY(h); 96638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling break; 97638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling case 180: 98638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling mChild.setTranslationX(w); 99638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling mChild.setTranslationY(h); 100638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling break; 101638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling case 270: 102638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling mChild.setTranslationX(w); 103638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling mChild.setTranslationY(0); 104638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling break; 1058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 106638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling mChild.setRotation(-mOrientation); 1078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 1108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public boolean shouldDelayChildPressedState() { 1118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return false; 1128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Rotate the view counter-clockwise 1158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 1168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setOrientation(int orientation, boolean animation) { 1178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb orientation = orientation % 360; 1188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mOrientation == orientation) return; 1198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mOrientation = orientation; 1208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb requestLayout(); 1218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public int getOrientation() { 1248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return mOrientation; 1258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb} 127