Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.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-为视图设置动画';s线性布局或相对布局中的上页边距/下页边距/等_Android_Android Layout_Android Animation - Fatal编程技术网

Android-为视图设置动画';s线性布局或相对布局中的上页边距/下页边距/等

Android-为视图设置动画';s线性布局或相对布局中的上页边距/下页边距/等,android,android-layout,android-animation,Android,Android Layout,Android Animation,我正在尝试创建一个从底部向上滑动的菜单。它从屏幕底部刚好可见的菜单视图开始,然后单击它使其向上滑动。我尝试使用TranslateAnimation,但尽管像素在移动,但菜单的点击区域与以前的位置相同。所以我认为,如果我可以在动画完成后调整菜单的边距,这将实现我想要的。然而,我不知道如何调整利润率 我试图创建一个LinearLayout.LayoutMargins对象,然后设置其边距并将其应用于菜单的视图(这是一个LinearLayout),但这不起作用 有什么想法吗?我的解决方案是创建两个线性布

我正在尝试创建一个从底部向上滑动的菜单。它从屏幕底部刚好可见的菜单视图开始,然后单击它使其向上滑动。我尝试使用
TranslateAnimation
,但尽管像素在移动,但菜单的点击区域与以前的位置相同。所以我认为,如果我可以在动画完成后调整菜单的边距,这将实现我想要的。然而,我不知道如何调整利润率

我试图创建一个
LinearLayout.LayoutMargins
对象,然后设置其边距并将其应用于菜单的视图(这是一个
LinearLayout
),但这不起作用


有什么想法吗?

我的解决方案是创建两个线性布局,一个处于“启动”状态(设置为“运行”),另一个处于“菜单”的“关闭”状态。然后,当用户单击按钮向上滑动菜单时,我调用显示菜单向上滑动的
TranslateAnimation
。我在动画上放置了一个侦听器,当动画结束时,该侦听器会使“向上”状态可见,而“向下”状态消失。我为“结束”动作颠倒了这个方向


这不完全是我最初想象的方式,但它确实起了作用。

我觉得这不太像是一种黑客行为。基本上,它是制作你自己的动画师。下面的设置仅用于在
RelativeLayout
中修改
topMargin
,但推广起来并不困难

import java.util.Calendar;

import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.animation.Interpolator;
import android.widget.RelativeLayout.LayoutParams;

public class MarginAnimation extends Thread {
    final String TAG = "MarginAnimation";
    long mStartTime;
    long mTotalTime;
    Interpolator mI;

    int mStartMargin;
    int mEndMargin;

    View mV;
    Activity mA;
    public MarginAnimation(Activity a, View v, 
            int startMargin, int endMargin, int totaltime,
            Interpolator i) {
        mV = v;
        mStartMargin = startMargin;
        mEndMargin = endMargin;
        mTotalTime = totaltime;
        mI = i;
        mA = a;
    }

    @Override
    public void run() {
        mStartTime = Calendar.getInstance().getTimeInMillis();
        while(!this.isInterrupted() && 
                Calendar.getInstance().getTimeInMillis() - mStartTime < mTotalTime) {

            mA.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if(MarginAnimation.this.isInterrupted())
                        return;
                    long cur_time = Calendar.getInstance().getTimeInMillis();
                    float perc_done = 1.0f*(cur_time-mStartTime)/mTotalTime;

                    final int new_margin = (int)(1.0f*(mEndMargin-mStartMargin)*mI.getInterpolation(perc_done)) + mStartMargin;
                    LayoutParams p = (LayoutParams) mV.getLayoutParams();
                    Log.v(TAG, String.format("Setting Margin to %d", new_margin));
                    p.topMargin = new_margin;
                    mV.setLayoutParams(p);                  
                }
            });

            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                return;
            }
        }
    }

}
import java.util.Calendar;
导入android.app.Activity;
导入android.util.Log;
导入android.view.view;
导入android.view.animation.Interpolator;
导入android.widget.RelativeLayout.LayoutParams;
公共类边缘化扩展线程{
最后一个字符串TAG=“MarginAnimation”;
时间长;
长时间;
插值器mI;
int mStartMargin;
内切边缘;
查看mV;
活性mA;
公共边缘化(活动a、视图v、,
int startMargin、int ENDARGIN、int totaltime、,
内插器(i){
mV=v;
mStartMargin=起始边缘;
mEndMargin=endMargin;
mTotalTime=总时间;
mI=i;
mA=a;
}
@凌驾
公开募捐{
mStartTime=Calendar.getInstance().getTimeInMillis();
而(!this.isInterrupted()&&
Calendar.getInstance().getTimeInMillis()-mStartTime
以下内容对我很有用。首先确定菜单的底部边距(以下倾为单位)是向上(完全可见)还是向下(大部分隐藏)

然后,在onCreate()中:

秘汁来了;-)

我使用两个实用功能:

private void setBottomMargin(View view, int bottomMarginInDips)
{
    ViewGroup.MarginLayoutParams layoutParams =    
        (ViewGroup.MarginLayoutParams)view.getLayoutParams();
    layoutParams.bottomMargin = dipsToPixels(bottomMarginInDips);
    view.requestLayout();
}

private int dipsToPixels(int dips)
{
    final float scale = getResources().getDisplayMetrics().density;
    return (int)(dips * scale + 0.5f);
}

这篇文章帮助我制作动画。在我的例子中,我有一个全屏网络视图。在一些用户操作中,此webview向右滑动,约70%,一个新的webview从左侧出现并占用可用空间。最终,新的webview覆盖了70%(x轴),旧的webview覆盖了其余部分。阿恩的解决方案帮了我很大的忙,动画一完成,就设置了旧视图的边界。伪代码:

       marginParams.leftMargin = 336; //(70% of 480px)
但我面临着一种奇怪的行为,我猜我的旧webview(现在只占30%的空间)正在重新格式化它的内容,可能认为它现在被压缩到了一个更小的空间,而不是表现得好像它只是滑向了右边。换句话说,一旦我设置了这个边距,webview的html布局就改变了。再一次,我不知道为什么,我猜它认为它的父窗口大小改变了。基于这个假设,我又添加了一行代码:

      marginParams.rightMargin = -336; //(same amount, but negative margin!)
这就成功了,不需要重新格式化html内容,我就可以并行地与这两个Web视图交互


我把这篇文章作为对阿恩的一个巨大的感谢,感谢你提出了这个想法,也感谢你为我所看到的行为和我的假设提供了任何信息。我实际上喜欢最终的解决方案,这是合乎逻辑的,但我可能错了。如有任何想法和意见,将不胜感激。非常感谢。

使用
ViewPropertyAnimator

if (view.getY() != margin) {
    view.animate().y(margin).setDuration(150).start();
}

没有
线性布局。布局边距
类。我想你的意思是
LinearLayout.LayoutParams
。如果您可以将代码张贴在调整参数的位置,这可能会帮助我们回答您的问题。对不起,您是对的,我的意思是
layoutparms
。我最终用另一种方法来完成我想要的。我构建了两个视图,一个用于“菜单打开”状态,另一个用于“菜单关闭”状态。然后,我使用了一个平移动画来向上滑动打开的菜单并隐藏关闭的菜单,反之亦然。这里不起作用,在Logcat上,我可以看到它多次设置了边距,但只有最后一次对视图有影响。我在mV.setLayoutParams(p)之后尝试了一个mV.invalidate(),但它不起作用,有什么提示吗?我这样称呼它:MarginAnimator ma=new MarginAnimator(efeitoactivity.this,img2,lp.topMargin,150500,new AccelerateInterpolator());ma.run();我也有同样的问题-
       marginParams.leftMargin = 336; //(70% of 480px)
      marginParams.rightMargin = -336; //(same amount, but negative margin!)
if (view.getY() != margin) {
    view.animate().y(margin).setDuration(150).start();
}