2 u011404046 u011404046 于 2016.02.14 23:45 提问

Android Activity切换界面抖动

我从一个FullScreen的Activity A跳到另一个不是FullScreen的Activity B,界面会抖动一下
,就是B刚进入的时候貌似也是全屏,然后状态出来,B的布局就被向下挤了,看上去就有抖动,这个怎么解决

8个回答

devmiao
devmiao   Ds   Rxr 2016.02.15 07:38
 其原理很简单,就是使用动画让组件来回摆动,代码如下:

MainActivity:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.home.animwindow; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageView; 

public class MainActivity extends Activity { 
    private EditText edit; 
    private Button btn; 
    private ImageView image; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        edit = (EditText) findViewById(R.id.edit); 
        image = (ImageView) findViewById(R.id.main_iv); 
        btn = (Button) findViewById(R.id.btn); 
        btn.setOnClickListener(new OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                Animation animation = AnimationUtils.loadAnimation( 
                        MainActivity.this, R.anim.myanim); 
                edit.startAnimation(animation); 
                image.startAnimation(animation); 
            } 
        }); 
    } 
}
布局:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <EditText 
        android:id="@+id/edit" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="100dp" 
        android:text="点击按钮、此窗口抖动" /> 

    <Button 
        android:id="@+id/btn" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="按钮" /> 

    <ImageView 
        android:id="@+id/main_iv" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@drawable/ic_launcher" /> 

</LinearLayout>
动画myanim:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@anim/cycle" > 

    <translate 
        android:duration="300" 
        android:fromXDelta="0" 
        android:fromYDelta="0" 
        android:toXDelta="-10" 
        android:toYDelta="-10" /> 
    <translate 
        android:duration="300" 
        android:fromXDelta="0" 
        android:fromYDelta="0" 
        android:startOffset="300" 
        android:toXDelta="10" 
        android:toYDelta="-10" /> 
    <translate 
        android:duration="300" 
        android:fromXDelta="0" 
        android:fromYDelta="0" 
        android:startOffset="600" 
        android:toXDelta="-10" 
        android:toYDelta="10" /> 
    <translate 
        android:duration="300" 
        android:fromXDelta="0" 
        android:fromYDelta="0" 
        android:startOffset="900" 
        android:toXDelta="10" 
        android:toYDelta="10" /> 

</set>
cycle:

?
1
2
3
<?xml version="1.0" encoding="utf-8"?> 
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" 
    android:cycles="5" />
devmiao
devmiao   Ds   Rxr 2016.02.15 07:38
 其原理很简单,就是使用动画让组件来回摆动,代码如下:

MainActivity:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.home.animwindow; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageView; 

public class MainActivity extends Activity { 
    private EditText edit; 
    private Button btn; 
    private ImageView image; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        edit = (EditText) findViewById(R.id.edit); 
        image = (ImageView) findViewById(R.id.main_iv); 
        btn = (Button) findViewById(R.id.btn); 
        btn.setOnClickListener(new OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                Animation animation = AnimationUtils.loadAnimation( 
                        MainActivity.this, R.anim.myanim); 
                edit.startAnimation(animation); 
                image.startAnimation(animation); 
            } 
        }); 
    } 
}
布局:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <EditText 
        android:id="@+id/edit" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="100dp" 
        android:text="点击按钮、此窗口抖动" /> 

    <Button 
        android:id="@+id/btn" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="按钮" /> 

    <ImageView 
        android:id="@+id/main_iv" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@drawable/ic_launcher" /> 

</LinearLayout>
动画myanim:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@anim/cycle" > 

    <translate 
        android:duration="300" 
        android:fromXDelta="0" 
        android:fromYDelta="0" 
        android:toXDelta="-10" 
        android:toYDelta="-10" /> 
    <translate 
        android:duration="300" 
        android:fromXDelta="0" 
        android:fromYDelta="0" 
        android:startOffset="300" 
        android:toXDelta="10" 
        android:toYDelta="-10" /> 
    <translate 
        android:duration="300" 
        android:fromXDelta="0" 
        android:fromYDelta="0" 
        android:startOffset="600" 
        android:toXDelta="-10" 
        android:toYDelta="10" /> 
    <translate 
        android:duration="300" 
        android:fromXDelta="0" 
        android:fromYDelta="0" 
        android:startOffset="900" 
        android:toXDelta="10" 
        android:toYDelta="10" /> 

</set>
cycle:

?
1
2
3
<?xml version="1.0" encoding="utf-8"?> 
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" 
    android:cycles="5" />
lyyybz
lyyybz 什么东西
一年多之前 回复
w358637319
w358637319   2016.02.15 09:30

全屏和非全屏高度不一样,切换可能会造成视觉差异,可以做个页面切换动画,透明度变化来减少这种视觉差

dongfeng9ge
dongfeng9ge   Ds   Rxr 2016.02.15 18:38

不全屏的activity就用dialog代替吧

brian512
brian512   2016.02.16 08:46

app的theme可能是全屏

qq_28850713
qq_28850713   2016.08.25 14:12

我也遇到了这个问题,就是软件在由全屏界面切花到有标题栏的界面就会产生抖动。

hihiwjc
hihiwjc   2016.09.08 10:54
    在全屏的Activity退出时加上这个就可以了
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
91program
91program   Ds   Rxr 2016.02.15 00:22

Acitivity的全屏是在每个Acitivity的初始化时设置的,按理说不应该出现这样的问题。建议你先试试都是全屏的切换。

91program
91program 回复91program: 全屏,要增加代码;但是非全屏是不要的!是不是要在非全屏的Acitivity 初始化时做一定的处理。我的一个应用中,要不都全屏、要不都非全屏,没有注意到LZ所说的问题。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
全屏activity跳转非全屏activity页面抖动问题的解决
全屏代码: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 最近遇到了在splash取消状态栏跳转到显示状态栏的页面上activity抖动的问题 解决方法: 在跳转到下个页
Android 页面切换时抖动问题
关于Android Activity(A)跳转到另一个Activity(B)的时候出现了一点问题; A页面是全屏,B页面是非全屏(顶部有系统状态栏),当从A跳到B的时候,B的页面的标题栏(自定义)有一半被状态栏给挡住了,然后B页面再向下恢复正常(这个过程持续0.5秒)。给人一种很明显的抖动感觉。体验很差。 解决方案: 在B页面setContentView方法后调用如下函数
全屏跳转到非全屏Activity的问题
一直以来,绝大多数APP都会有一个全屏的闪屏页面,若干秒之后跳转到非全屏界面。然而最近发现一个问题,很多app也一直存在,只是从来没在意看过,就没发现。效果图可以看到第二个界面发生了状态栏抖动的情况。其实不在意,有时候真的看不出来什么。但是既然发现了就要解决。刚开始也没什么好的方法,首先想到的就是网上搜索。看了很多方案,确也没有一个完美的方法。全屏界面是刚进入的时候设置了全屏,没了状态栏,进入非全屏
Android 在从全屏切换到非全屏的时候闪动问题
问题: 今天遇到了一个问题,从全屏的界面跳转到非全屏的界面的时候actionbar会有闪动挤压的情况在实验后的到一下解决方案:查阅了android官网 有如下 Window FlagWindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREENplace the window within the entire screen, ignoring decoratio
【android开发】解决输入法与表情面板切换时的界面抖动问题
昨天琢磨了下android的输入法弹出模式,突然发现利用动态切换输入法的弹出模式可以解决输入法抖动的问题。具体是怎样的抖动呢?我们先看微博的反面教材。 【具体表现为:表情面板与输入法面板高度不一致,从而导致弹出输入法(layout被挤压)时,同时又需要隐藏表情面板(layout被拉升),最终让界面产生了高度差抖动,所以在切换时明显会有不大好的抖动体验)】使用了解决抖动的解决方案后,效果如下:
Activity中ScrollView Fragment切换界面跳动问题
场景:Activity里面ScrollView套了几个Fragment,Tab选项卡切换 处理方式:在ScrollView的根View添加下面三行加粗的属性即可         android:id="@+id/refresh_scrollview"         android:layout_width="match_parent"         android:layout
Android:解决全屏界面到带有状态栏界面切换问题
问题如下图: 从一个全屏界面跳转到正常的界面时,顶部份显示半个,会延迟1秒恢复正常。 解决方案: 在跳转界面之前(也就是在全屏的界面),加上以下代码 /**解决进入首页时 上部分显示半个问题*/ Intent intent; WindowManager.LayoutParams attr = getWindow().getAttributes();
android 优化软键盘与表情面板切换时发生抖动
之前一直用的大神自定义的软键盘表情View,一直也没去详细研究,最近踩到坑了,当软键盘弹出时再切换到表情面板,或者表情面板切换到软键盘弹出时,发生页面抖动,体验不好。经过2天的摸索找到了最终简单的解决方案,不用去计算软键盘和表情的高度。什么原因引起的抖动呢?比如从软键盘切换到表情盘,那么软键盘会先隐藏,接着EditText也跟着滑下去了,然后显示表情盘,就又把EditText顶上去了,这个过程给我...
Android之解决全屏切换非全屏的页面压缩问题
Android从全屏页面(A)跳转到非全屏页面(B)会发现非全屏页面(B)的页面会闪动一下。这里的闪动高度是状态栏的高度,也就是B页面显示状态栏时页面的显示布局会向下拉伸状态栏的高度。从这可以看出底层的布局应该是采用相对布局实现的。 通常解决该问题的方法是在A页面结束前/后,设置非全屏,比如在A页面的UI线程中添加以下代码: WindowManager.LayoutParams attr =
【从头学android】在两个Activity之间实现界面切换
1.java /** * */ package com.itest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import