android根据应用方向自动旋转的自定义view
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);
}
更多相关文章
- 代码中设置drawableleft
- android 3.0 隐藏 系统标题栏
- Android开发中activity切换动画的实现
- Android(安卓)学习 笔记_05. 文件下载
- Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
- 技术博客汇总
- android 2.3 wifi (一)
- AndRoid Notification的清空和修改
- Android中的Chronometer