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);

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值