import android.content.Context;

import android.util.AttributeSet;

import android.view.View;

import android.view.ViewGroup;

 

import com.android.camera.Log;

 

// A RotateLayout is designed to display a single item and provides the

// capabilities to rotate the item.

public class RotateLayout extends ViewGroup implements Rotatable {

private static final String TAG = "RotateLayout";

 

private OnSizeChangedListener mListener;

private int mOrientation;

protected View mChild;

 

public RotateLayout(Context context, AttributeSet attrs) {

super(context, attrs);

// The transparent background here is a workaround of the render issue

// happened when the view is rotated as the device's orientation

// changed. The view looks fine in landscape. After rotation, the view

// is invisible.

setBackgroundResource(android.R.color.transparent);

}

 

/** A callback to be invoked when the preview frame's size changes. */

public interface OnSizeChangedListener {

void onSizeChanged(int width, int height);

}

 

@Override

protected void onFinishInflate() {

mChild = getChildAt(0);

mChild.setPivotX(0);

mChild.setPivotY(0);

}

 

@Override

protected void onLayout(boolean change, int left, int top, int right, int bottom) {

int width = right - left;

int height = bottom - top;

switch (mOrientation) {

case 0:

case 180:

mChild.layout(0, 0, width, height);

break;

case 90:

case 270:

mChild.layout(0, 0, height, width);

break;

default:

break;

}

}

 

@Override

protected void onMeasure(int widthSpec, int heightSpec) {

int w = 0;

int h = 0;

switch (mOrientation) {

case 0:

case 180:

measureChild(mChild, widthSpec, heightSpec);

w = mChild.getMeasuredWidth();

h = mChild.getMeasuredHeight();

break;

case 90:

case 270:

measureChild(mChild, heightSpec, widthSpec);

w = mChild.getMeasuredHeight();

h = mChild.getMeasuredWidth();

break;

default:

break;

}

setMeasuredDimension(w, h);

 

switch (mOrientation) {

case 0:

mChild.setTranslationX(0);

mChild.setTranslationY(0);

break;

case 90:

mChild.setTranslationX(0);

mChild.setTranslationY(h);

break;

case 180:

mChild.setTranslationX(w);

mChild.setTranslationY(h);

break;

case 270:

mChild.setTranslationX(w);

mChild.setTranslationY(0);

break;

default:

break;

}

mChild.setRotation(-mOrientation);

}

 

@Override

public boolean shouldDelayChildPressedState() {

return false;

}

 

// Rotate the view counter-clockwise

@Override

public void setOrientation(int orientation, boolean animation) {

Log.v(TAG, "setOrientation(" + orientation + ", " + animation + ") mOrientation="

+ mOrientation);

orientation = orientation % 360;

if (mOrientation == orientation) {

return;

}

mOrientation = orientation;

requestLayout();

}

 

public int getOrientation() {

return mOrientation;

}

 

public void setOnSizeChangedListener(OnSizeChangedListener listener) {

mListener = listener;

}

 

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

Log.d(TAG, "onSizeChanged(" + w + ", " + h + ", " + oldh + ", " + oldh + ") " + this);

if (mListener != null) {

mListener.onSizeChanged(w, h);

}

}

}

-----------------------------------------------------------------------------

public interface Rotatable {

// Set parameter 'animation' to true to have animation when rotation.

void setOrientation(int orientation, boolean animation);

}

 

更多相关文章

  1. 代码中设置drawableleft
  2. android 3.0 隐藏 系统标题栏
  3. Android开发中activity切换动画的实现
  4. Android(安卓)学习 笔记_05. 文件下载
  5. Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
  6. 技术博客汇总
  7. android 2.3 wifi (一)
  8. AndRoid Notification的清空和修改
  9. Android中的Chronometer

随机推荐

  1. 驾考一点通 android
  2. 扣丁学堂笔记第05天高级UI组件(一)
  3. Android之AudioRecord实现"助听器"
  4. Androd学习笔记——Conflict between And
  5. Android中的Drawable资源—— ScaleDrawa
  6. Qt平台下OpenCV for Android库的顺序
  7. Android中定义数组与使用
  8. Android RelativeLayout属性介绍
  9. Android将多个视频文件拼接为一个文件
  10. android底层的学习