Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 用动画调整大小_Android_Android Animation_Android Softkeyboard - Fatal编程技术网

Android 用动画调整大小

Android 用动画调整大小,android,android-animation,android-softkeyboard,Android,Android Animation,Android Softkeyboard,我在清单中使用了android:WindowsOfInputMode=“adjustResize”,以防止键盘隐藏活动按钮。它可以工作,但当键盘打开时,我的按钮会向上移动。我想知道的是,它有点神经质,我能有任何动画让它平稳过渡吗 <activity android:name=".Activity" android:screenOrientation="portrait" android:windowSoftInputMode="adjustR

我在清单中使用了android:WindowsOfInputMode=“adjustResize”,以防止键盘隐藏活动按钮。它可以工作,但当键盘打开时,我的按钮会向上移动。我想知道的是,它有点神经质,我能有任何动画让它平稳过渡吗

<activity
        android:name=".Activity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize">
</activity>

无法重写方法
setSoftInputMode(int)
,它的实现在
窗口类中,我认为不可能用自己的窗口替换当前窗口。您也不能从
WindowManager
管理此操作。
您可以在
视图组上创建一个侦听器,并在
软键盘打开和关闭时捕捉修改的布局。事实上,当SKB出现时,容器的布局会重新绘制并更改其高度。通过此事件,您可以在子视图上设置
动画
,并产生平滑效果

编辑:也可以使用该解决方案来代替(如下所示的解决方案:)创建自定义视图组类。

您必须创建自己的视图组,并将其作为布局中的父容器。它将实现一个将在UI类中处理的接口(
活动
片段
,等等)。我找到了。根据它,下面是viewgroup的类来处理高度的更改:

public class ContainerViewHandler extends RelativeLayout {

    private boolean isKeyboardShown;
    private onKeyboardStateChange listener;

    public ContainerViewHandler(Context context) {
        super(context);
    }

    public ContainerViewHandler(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ContainerViewHandler(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setKeyboardStateListener(onKeyboardStateChange listener) {
        this.listener = listener;
    }

    // Callbacks
    public interface onKeyboardStateChange {
        void onKeyboardShow();
        void onKeyboardHide();
    }

    @Override
    public boolean dispatchKeyEventPreIme(@NonNull KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            // Keyboard is hiding
            if (isKeyboardShown) {
                isKeyboardShown = false;
                listener.onKeyboardHide();
            }
        }
        return super.dispatchKeyEventPreIme(event);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final int proposedHeight = MeasureSpec.getSize(heightMeasureSpec);
        final int actualHeight = getHeight();
        if (actualHeight > proposedHeight) {
            // Keyboard is showing
            if (!isKeyboardShown) {
                isKeyboardShown = true;
                listener.onKeyboardShow();
            }
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}
现在,您必须在布局中添加此视图组(例如
)。然后,您必须在活动中实现上述接口
setKeyboardStateListener
,如下所示:

ContainerViewHandler containerView = 
          (ContainerViewHandler) findViewById(R.id.container_view);
containerView.setKeyboardStateListener(new ContainerHandler.onKeyboardStateChange() {
    @Override
    public void onKeyboardShow() {
        Log.v("onKeyboardShow()", "SoftKeyboard is showing. Hello!");
    }

    @Override
    public void onKeyboardHide() {
        Log.v("onKeyboardHide()", "SoftKeyboard is hiding, Bye bye!");
    }
});
因此,您可以管理不同的动画来处理和防止按钮直接跳到SKB上方。为了验证这一点,我尝试重现反弹效果:

以下是我的实现的样子:

containerView.setKeyboardStateListener(new ContainerViewHandler.onKeyboardStateChange() {
    @Override
    public void onKeyboardShow() {
        setAnimationUp();
    }

    @Override
    public void onKeyboardHide() {
        setAnimationDown();
    }
});

private void setAnimationUp() {
    footerButton.setVisibility(View.GONE);
    float dpY = AppUtils.convertPxToDp(20, this); // custom conversion method

    Animation a1 = new TranslateAnimation(0, 0, footerButton.getHeight() * 4, -(dpY));
    a1.setDuration(250);
    a1.setFillAfter(true);

    final Animation a2 = new TranslateAnimation(0, 0, -(dpY), 0);
    a2.setDuration(320);
    a2.setFillAfter(true);

    a1.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
            footerButton.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            footerButton.startAnimation(a2);
        }

        @Override
        public void onAnimationRepeat(Animation animation) { }
    });

    footerButton.startAnimation(a1);
}

private void setAnimationDown() {
    float dpY = AppUtils.convertPxToDp(30, this); // custom conversion method
    Animation b1 = new TranslateAnimation(0, 0, -(dpY), dpY);
    b1.setDuration(300);
    b1.setFillAfter(true);

    final Animation b2 = new TranslateAnimation(0, 0, dpY, 0);
    b2.setDuration(320);
    b2.setFillAfter(true);

    b1.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) { }

        @Override
        public void onAnimationEnd(Animation animation) {
            footerButton.startAnimation(b2);
        }

        @Override
        public void onAnimationRepeat(Animation animation) { }
    });

    footerButton.startAnimation(b1);
}
我首先在第一个回调中设置两个动画(a1、a2):

  • a1:从SKB下方(后面)开始(大约
    4xbutton的高度
    ),直到其上方的
    20dp
  • a2:从
    20dp
    开始,返回到
    0dp
    (正常位置)
以及第二次回调中的另外两个(b1、b2):

  • b1:从顶部按钮达到
    30dp
    的位置开始,向下到父容器外部的
    30dp
  • b2:最后,从
    30dp
    输出到
    0dp
    (初始位置)
PS:不要忘记在清单中使用
adjustResize
,并将内容(例如我测试中的EditText)
置于页脚按钮上方,该按钮将
alignParentBottom
设置为true。

您在父布局上尝试过“animateLayoutChanges=“true”吗?这是为布局更改制作动画的最简单和最简单的方法。但是,将由您决定的动画不是由您决定的,而是由管理应用程序的操作系统决定的。