androidview旋轉
1. 如何使android布局webview gif旋轉90度
可以使用android 的animation類,可以進行旋轉和一些基本的向左向右的動作。
2. Android 旋轉動畫
java"><rotate
android:fromDegrees="45"//起始旋轉的角度
android:toDegrees="89"//結束選裝後的角度
android:ration="500"//執行時間為500ms
android:pivotX="50%"//距離控制項左邊緣50%
android:pivotY="50%"//距離控制項上邊緣50%(與上邊結合就是控制項中心)
android:fillEnabled="true"
android:fillAfter="true"//動畫執行完後停留在執行完的狀態
/>
—————————————————————————————————————————
當然也可以通過代碼用animation實現
好久沒寫,應該是
RotateAnimationanimation=newRotateAnimation(0f,45f,Animation.RELATIVE_TO_SELF,
0.5f,Animation.RELATIVE_TO_SELF,0.5f);
animation.setDuration(500);
view.setAnimation(animation);
3. android開發中如何旋轉布局
樓主你好,這個可以通過動畫來達到這個效果的,代碼如下:
只要把您的layout對象傳進去就行了
public void showAnimation(View mView)
{
final float centerX = mView.getWidth() / 2.0f;
final float centerY = mView.getHeight() / 2.0f;
//這個是設置需要旋轉的角度,我設置的是180度
RotateAnimation rotateAnimation = new RotateAnimation(0, 180, centerX,
centerY);
//這個是設置通話時間的
rotateAnimation.setDuration(1000*3);
rotateAnimation.setFillAfter(true);
mView.startAnimation(rotateAnimation);
}
4. android屏幕旋轉,webview重新載入
在create時候加個狀態判斷
protected void onCreate(Bundle savedInstanceState){
...
if (savedInstanceState == null)
{
mWebView.loadUrl("your_url");
}
...
}
2. 重載保存狀態的函數:
@Override
protected void onSaveInstanceState(Bundle outState )
{
super.onSaveInstanceState(outState);
mWebView.saveState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
super.onRestoreInstanceState(savedInstanceState);
mWebView.restoreState(savedInstanceState);
}
5. Android 感測器的 數據流和框架 是怎麼樣讓 屏幕旋轉
這篇文章寫的感測器數據從驅動傳遞到應用程序的整個流程,還有數據校正的問題。
應用程序怎麼樣設置可以讓自己隨著設備的傾斜度變化而旋轉方向呢?在AndroidManifest.xml文件中的android:screenOrientation就可以了。這里追蹤一下它的內部機制。
先看一個最關鍵的部件:/frameworks/base/core/java/android/view/WindowOrientationListener.java
這個介面注冊一個accelerator,並負責把accelerator的數據轉化為orientation。這個API對應用程序不公開,我看Android2.3的源碼時發現只有PhoneWindowManager使用到它了。
/frameworks/base/policy/../PhoneWindowManager.java
PhonwWindowManager注冊了一個WindowOrientationListener,就可以非同步獲取當前設備的orientation了。再結合應用程序在AndroidManifest.xml中設置的值來管理著應用程序界面的旋轉方向。以下是PhoneWindowManager.java中相關的兩個代碼片段。
[java] view plain
public void onOrientationChanged(int rotation) {
// Send updates based on orientation value
if (localLOGV) Log.v(TAG, "onOrientationChanged, rotation changed to " +rotation);
try {
mWindowManager.setRotation(rotation, false,
mFancyRotationAnimation);
} catch (RemoteException e) {
// Ignore
}
}
... ...
switch (orientation) {//這個值就是當前設備屏幕的旋轉方向,再結合應用程序設置的android:configChanges屬性值就可以確定應用程序界面的旋轉方向了。應用程序設置值的優先順序大於感測器確定的優先順序。
case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
//always return portrait if orientation set to portrait
return mPortraitRotation;
case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
//always return landscape if orientation set to landscape
return mLandscapeRotation;
case ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT:
//always return portrait if orientation set to portrait
return mUpsideDownRotation;
case ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE:
//always return seascape if orientation set to reverse landscape
return mSeascapeRotation;
case ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE:
//return either landscape rotation based on the sensor
mOrientationListener.setAllow180Rotation(
isLandscapeOrSeascape(Surface.ROTATION_180));
return getCurrentLandscapeRotation(lastRotation);
case ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT:
mOrientationListener.setAllow180Rotation(
!isLandscapeOrSeascape(Surface.ROTATION_180));
return getCurrentPortraitRotation(lastRotation);
}
讓應用程序隨屏幕方向自動旋轉的實現原理就這么交待完了。我解決這一步時也沒有費多少力氣,在板子上打開SensorTest,對比一下XYZ三個軸和MileStone上面的數據,修改一下正負值就可以了。但要解決Teeter運行時Z軸反轉的問題,還得深層次挖一挖。
PhoneWindowManager.java中有這么一句:
mWindowManager.setRotation(rotation, false, mFancyRotationAnimation);
當PhonewindowManager通過WindowOrientationListener這個監聽器得知屏幕方向改變時,會通知給WindowManagerService(/frameworks/base/service/../WindowManagerService.java)
WindowManagerService中有這么一個監聽器集合:mRotationWatchers,誰想監聽屏幕方向改變,就會在這里注冊一個監聽器。SensorManager就這么幹了。然後,通過下面這個非同步方法獲知當前的屏幕方向
6. Android 怎麼旋轉TextView文字顯示方向
在一個項目中,需要旋轉TextView的文字顯示方向,怎麼實現呢?這里提供一種變通的方法來實現該功能:Animation動畫,保存動畫結束狀態來實現該功能。
主要代碼如下:
1、定義一個anim xml資源文件rotate_right.xml
Html代碼
<?xml version="1.0" encoding="utf-8"?>
<set>
<rotate xmlns:android="IP" android:interpolator="@android:anim/linear_interpolator"
android:fromDegrees="0" android:toDegrees="-90" android:ration="0"
android:pivotX="50%" android:pivotY="50%" android:repeatCount="0" />
</set>
2、設置textview播放動畫
Java代碼
private Animation mAnimationRight;
private TextView mlblRightPhotoNum;
mAnimationRight = AnimationUtils.loadAnimation(mContext, R.anim.rotate_right);
mAnimationRight.setFillAfter(true);
mlblRightPhotoNum = (TextView) findViewById(R.id.lblRightPhotoNum);
mlblRightPhotoNum.setAnimation(mAnimationRight);
總結:主要用到了Animation 的 setFillAfter(boolean b)方法,該方法表示是否保持動畫結束時狀態;
拓展:
1、Animation 方法:setFillBefore(boolean b)當動畫結束後,是否返回動畫開始狀態。
2、當activity必須指定launchMode時【例如:Camera程序必須制定橫屏,才能取景正常】,可以通過OrientationEventListener及動畫旋轉來模擬橫豎屏效果
7. 如何在啟動時讓android系統屏幕旋轉90度
設備平放,屏幕朝正上方。以下四個常量分別代表:
private static final int ROTATION_0 = 0;//初始情況。這個時候設備是橫屏還是豎屏與硬體設備安裝時默認的顯示方向有關。
private static final int ROTATION_90 = 1;//設置屏幕方向自動旋轉後,右側翻起側立時,屏幕會旋轉到這個方向。
private static final int ROTATION_270 = 2;//設置屏幕方向自動旋轉後,左側翻起度側立時,屏幕會旋轉到這個方向。
private static final int ROTATION_180 = 3;//設置屏幕方向自動旋轉後,屏幕底部側立時,屏幕會旋轉到這個方向。
再看兩個數組:
view plain
private static final int[][][] THRESHOLDS_WITH_180 = new int[][][] {
{{60, 165}, {165, 195}, {195, 300}},
{{0, 30}, {165, 195}, {195, 315}, {315, 360}},
{{0, 45}, {45, 165}, {165, 195}, {330, 360}},
{{0, 45}, {45, 135}, {225, 315}, {315, 360}},
};
private static final int[][] ROTATE_TO_WITH_180 = new int[][] {
{ROTATION_90, ROTATION_180, ROTATION_270},
{ROTATION_0, ROTATION_180, ROTATION_90, ROTATION_0},
{ROTATION_0, ROTATION_270, ROTATION_180, ROTATION_0},
{ROTATION_0, ROTATION_90, ROTATION_270, ROTATION_0},
};
當前屏幕旋轉方向為ROTATION_0時,取int[][] threshold=THRESHOLDS_WITH_180[0];
當前屏幕旋轉方向為ROTATION_90時,取int[][] threshold=THRESHOLDS_WITH_180[1];
當前屏幕旋轉方向為ROTATION_270時,取int[][] threshold=THRESHOLDS_WITH_180[2];
當前屏幕旋轉方向為ROTATION_180時,取int[][] threshold=THRESHOLDS_WITH_180[3];
其中,threshold中的每一個元素由兩個值構成,用來表示一個范圍。
WindowOrientationListener會注冊一個Accelerator類型的SensorEventListener,當有新的SensorEvent產生時,調用filterOrientation產生一個int orientation值。這個值會在threshold的各個元素表示的范圍中匹配,看會落在哪個范圍。假設當前屏幕方向為ROTATION_0,那麼threshold={{60, 165}, {165, 195}, {195, 300}},假設這個時候把屏幕左側翻起90度。filterOrientation計算出的orientation值落在了第三個元素范圍內,那麼去ROTATE_TO_WITH_180中尋找與它對應的值,發現是ROTATION_270,那麼就把當前屏幕旋轉方向改變為270度。threshold的取值就變成了THRESHOLDS_WITH_180[2]。當把屏幕再次放平時,filterOrientation計算出的orientation值會落在第一個元素表示的范圍內。去ROTATE_TO_WITH_180中尋找與它對應的值,發現是ROTATION_0,那麼當前屏幕旋轉方向被改變為0度。
還有一個變數比較重要,mAllow180Rotation,這個變數設置為false時,就不使用THRESHOLDS_WITH_180和ROTATE_TO_WITH_180這一對數組來做上面這些變的了,就使用THRESHOLDS和ROTATE_TO。
其實,我研究了半天也沒有搞清filterOrientation的演算法以及THRESHOLDS_WITH_180和THRESHOLDS這兩個數組裡面的每個數字代表的具體意義。最後只搞清了上面的這個流程,還有ROTATION_0, ROTATION_90, ROTATION_270, ROTATION_180這四個角度分別代表哪四個方向。但這足以應付我們要做的事情了。
比如,我想讓屏幕最多隻旋轉90度和180度,不讓它有旋轉270度的機會。那就把ROTATE_TO_WITH_180裡面的ROTATION_270全部變成90度。這樣,應該旋轉到270度時,就會旋轉到90度了。如果不想讓屏幕旋轉,把所有值都改成ROTATION_0就可以了。
再深入挖掘一下這個話題
PhonwWindowManager是唯一實現WindowOrientationListener介面的類,它管理著整個設備界面的顯示。當PhonwWindowManager通過WindowOrientationListener知道屏幕方向發生旋轉時,會告訴WindowManagerService:
mWindowManager.setRotation(rotation, false, mFancyRotationAnimation);
而WindowManagerService得到這個通知後,會做兩個比較重要的事情:
1、Surface.setOrientation(0, rotation, animFlags);
2、mRotationWatchers.get(i).onRotationChanged(rotation);
我們知道,每個Activity都有一個View樹,每個View樹都是繪畫在一個Surface上面的。通過上面這兩步,先把Surface給旋轉了,再告訴Activity重新繪制View樹,就完了整個屏幕的旋轉。
8. android怎麼實現圖片旋轉
可以使用RotateAnimation動畫實現,設定無限循環即可
代碼如下
{
ImageViewiv;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
iv=(ImageView)findViewById(R.id.image);
RotateAnimationanimation=newRotateAnimation(0,360);
animation.setDuration(100000);//設定轉一圈的時間
animation.setRepeatCount(Animation.INFINITE);//設定無限循環
animation.setRepeatMode(Animation.RESTART);
iv.startAnimation(animation);
}
}
也可以自定義view繼承於imageview,啟動一個線程,在while循環里設置view的旋轉角度
{
privatefloatmCurDegree=0;//當前旋轉角度
publicRotateView(Contextcontext,AttributeSetattrs){
super(context,attrs);
newThread(this).start();
}
@Override
protectedvoidonLayout(booleanchanged,intleft,inttop,intright,
intbottom){
super.onLayout(changed,left,top,right,bottom);
//設定旋轉中心
setPivotX(getMeasuredWidth()/2);
setPivotY(getMeasuredHeight()/2);
}
@Override
publicvoidrun(){
while(true){
setRotation(mCurDegree);
mCurDegree+=5;
postInvalidate();
SystemClock.sleep(16);
}
}
}
在布局文件里使用RotateView代替imageview即可
9. 求助,怎麼用android實現控制項的3D立體旋轉效果
實現水平滑動,所以可在手勢抬起的時候進行判斷並處理,是滑動顯得流暢,代碼如下:
packagecom.example.rotation3dview;
importandroid.content.Context;
importandroid.graphics.Camera;
importandroid.graphics.Canvas;
importandroid.graphics.Matrix;
importandroid.util.AttributeSet;
importandroid.view.MotionEvent;
importandroid.view.VelocityTracker;
importandroid.view.View;
importandroid.view.ViewDebug.HierarchyTraceType;
importandroid.view.ViewGroup;
importandroid.widget.ImageView;
importandroid.widget.Scroller;
{
privateintmCurScreen=1;
//滑動的速度
privatestaticfinalintSNAP_VELOCITY=500;
;
privateintmWidth;
privateScrollermScroller;
privateCameramCamera;
privateMatrixmMatrix;
//旋轉的角度,可以進行修改來觀察效果
privatefloatangle=90;
publicRote3DView(Contextcontext,AttributeSetattrs){
super(context,attrs);
mScroller=newScroller(context);
mCamera=newCamera();
mMatrix=newMatrix();
initScreens();
}
publicvoidinitScreens(){
ViewGroup.LayoutParamsp=newViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
for(inti=0;i<3;i++){
this.addView(newImageView(this.getContext()),i,p);
}
((ImageView)this.getChildAt(0)).setImageResource(R.drawable.page1);
((ImageView)this.getChildAt(1)).setImageResource(R.drawable.page2);
((ImageView)this.getChildAt(2)).setImageResource(R.drawable.page3);
}
@Override
protectedvoidonLayout(booleanchanged,intl,intt,intr,intb){
intchildLeft=0;
finalintchildCount=getChildCount();
for(inti=0;i<childCount;i++){
finalViewchildView=getChildAt(i);
if(childView.getVisibility()!=View.GONE){
finalintchildWidth=childView.getMeasuredWidth();
childView.layout(childLeft,0,childLeft+childWidth,childView.getMeasuredHeight());
childLeft+=childWidth;
}
}
}
@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
finalintwidth=MeasureSpec.getSize(widthMeasureSpec);
finalintwidthMode=MeasureSpec.getMode(widthMeasureSpec);
if(widthMode!=MeasureSpec.EXACTLY){
thrownewIllegalStateException("僅支持精確尺寸");
}
finalintheightMode=MeasureSpec.getMode(heightMeasureSpec);
if(heightMode!=MeasureSpec.EXACTLY){
thrownewIllegalStateException("僅支持精確尺寸");
}
finalintcount=getChildCount();
for(inti=0;i<count;i++){
getChildAt(i).measure(widthMeasureSpec,heightMeasureSpec);
}
scrollTo(mCurScreen*width,0);
}
privatefloatmDownX;
@Override
publicbooleanonTouchEvent(MotionEventevent){
if(mVelocityTracker==null){
mVelocityTracker=VelocityTracker.obtain();
}
//將當前的觸摸事件傳遞給VelocityTracker對象
mVelocityTracker.addMovement(event);
floatx=event.getX();
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
if(!mScroller.isFinished()){
mScroller.abortAnimation();
}
mDownX=x;
break;
caseMotionEvent.ACTION_MOVE:
intdisX=(int)(mDownX-x);
mDownX=x;
scrollBy(disX,0);
break;
caseMotionEvent.ACTION_UP:
=mVelocityTracker;
velocityTracker.computeCurrentVelocity(1000);
intvelocityX=(int)velocityTracker.getXVelocity();
if(velocityX>SNAP_VELOCITY&&mCurScreen>0){
snapToScreen(mCurScreen-1);
}elseif(velocityX<-SNAP_VELOCITY&&mCurScreen<getChildCount()-1){
snapToScreen(mCurScreen+1);
}else{
snapToDestination();
}
if(mVelocityTracker!=null){
mVelocityTracker.recycle();
mVelocityTracker=null;
}
break;
}
returntrue;
}
@Override
publicvoidcomputeScroll(){
if(mScroller.computeScrollOffset()){
scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
postInvalidate();
}
}
publicvoidsnapToDestination(){
setMWidth();
finalintdestScreen=(getScrollX()+mWidth/2)/mWidth;
snapToScreen(destScreen);
}
publicvoidsnapToScreen(intwhichScreen){
whichScreen=Math.max(0,Math.min(whichScreen,getChildCount()-1));
setMWidth();
intscrollX=getScrollX();
intstartWidth=whichScreen*mWidth;
if(scrollX!=startWidth){
intdelta=0;
intstartX=0;
if(whichScreen>mCurScreen){
setPre();
delta=startWidth-scrollX;
startX=mWidth-startWidth+scrollX;
}elseif(whichScreen<mCurScreen){
setNext();
delta=-scrollX;
startX=scrollX+mWidth;
}else{
startX=scrollX;
delta=startWidth-scrollX;
}
mScroller.startScroll(startX,0,delta,0,Math.abs(delta)*2);
invalidate();
}
}
privatevoidsetNext(){
intcount=this.getChildCount();
Viewview=getChildAt(count-1);
removeViewAt(count-1);
addView(view,0);
}
privatevoidsetPre(){
intcount=this.getChildCount();
Viewview=getChildAt(0);
removeViewAt(0);
addView(view,count-1);
}
privatevoidsetMWidth(){
if(mWidth==0){
mWidth=getWidth();
}
}
}
實現立體效果,添加如下代碼:
/*
*當進行View滑動時,會導致當前的View無效,該函數的作用是對View進行重新繪制調用drawScreen函數
*/
@Override
protectedvoiddispatchDraw(Canvascanvas){
finallongdrawingTime=getDrawingTime();
finalintcount=getChildCount();
for(inti=0;i<count;i++){
drawScreen(canvas,i,drawingTime);
}
}
publicvoiddrawScreen(Canvascanvas,intscreen,longdrawingTime){
//得到當前子View的寬度
finalintwidth=getWidth();
finalintscrollWidth=screen*width;
finalintscrollX=this.getScrollX();
//偏移量不足的時
if(scrollWidth>scrollX+width||scrollWidth+width<scrollX){
return;
}
finalViewchild=getChildAt(screen);
finalintfaceIndex=screen;
finalfloatcurrentDegree=getScrollX()*(angle/getMeasuredWidth());
finalfloatfaceDegree=currentDegree-faceIndex*angle;
if(faceDegree>90||faceDegree<-90){
return;
}
finalfloatcenterX=(scrollWidth<scrollX)?scrollWidth+width
:scrollWidth;
finalfloatcenterY=getHeight()/2;
finalCameracamera=mCamera;
finalMatrixmatrix=mMatrix;
canvas.save();
camera.save();
camera.rotateY(-faceDegree);
camera.getMatrix(matrix);
camera.restore();
matrix.preTranslate(-centerX,-centerY);
matrix.postTranslate(centerX,centerY);
canvas.concat(matrix);
drawChild(canvas,child,drawingTime);
canvas.restore();
}