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学习路线(五)开启另一个Activity
  2. Android中的样式和主题(style & theme)
  3. android javascript 调用activity
  4. Android 短信链接打开APP
  5. Android:实现隐藏应用功能
  6. 赵雅智:android使用adb命令详解附图
  7. Intent组件构成,解析机制
  8. Android(安卓)enum(枚举类型)使用详解
  9. java.io.IOException:Can't read [F:\..
  10. Android开发全程记录(十五)——android调用