【问题标题】:How can I set "toXDelta" translate animation value from java code?如何设置“toXDelta”从 java 代码转换动画值?
【发布时间】:2015-12-04 22:14:09
【问题描述】:

如何从 java 代码中设置 toXDelta 值?我需要先计算它,所以我不能只在 xml 中使用最终值。我可以在我的视图上使用 animate().translateX 但是我不能让动画减慢到最后......有什么想法吗?

【问题讨论】:

    标签: android android-animation translate-animation


    【解决方案1】:

    在翻译动画中,您可以在制作它的对象时发送该值。

    TranslateAnimation trans = new TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta);
    

    你在这里读到了::

    public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)

    在 API 级别 1 中添加 从代码构建 TranslateAnimation 时使用的构造函数

    参数

    fromXDelta 在动画开始时应用 X 坐标的变化

    toXDelta 在动画结束时应用 X 坐标的变化

    fromYDelta 在动画开始时应用 Y 坐标的变化

    toYDelta 在动画结束时应用 Y 坐标的变化

    希望是你的要求

    【讨论】:

    • @curousi 有线性布局,权重总和为 3。在linearlayout内部,我有一个权重为1的相对布局。所以当我从相对布局为按钮设置动画时,它只能通过相对布局移动,但我想为主要的linearlayout设置动画,你知道有什么解决方案吗?
    • 我想从右向左移动 textview name "txt_count_point_minus"
    • 在您的线性布局中,您正在动态添加相对布局?
    • 视图正在移动,但它移动到子布局边界
    【解决方案2】:

    你可以使用 Viewfilper 方法。参考是:ViewFlipper | Android Developers

    这里有一个例子。(Android ViewFlipper Example)

    然后在代码中制作自定义动画(参见 res/anim 文件夹)

    这是示例代码:

    MainActivity.java 代码:

    package com.javacodegeeks.android.viewflipperapp;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.widget.ViewFlipper;
    
    public class MainActivity extends Activity {
        private ViewFlipper viewFlipper;
        private float lastX;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            viewFlipper = (ViewFlipper) findViewById(R.id.viewflipper);
        }
    
        // Using the following method, we will handle all screen swaps.
        public boolean onTouchEvent(MotionEvent touchevent) {
            switch (touchevent.getAction()) {
    
            case MotionEvent.ACTION_DOWN: 
                lastX = touchevent.getX();
                break;
            case MotionEvent.ACTION_UP: 
                float currentX = touchevent.getX();
    
                // Handling left to right screen swap.
                if (lastX < currentX) {
    
                    // If there aren't any other children, just break.
                    if (viewFlipper.getDisplayedChild() == 0)
                        break;
    
                    // Next screen comes in from left.
                    viewFlipper.setInAnimation(this, R.anim.slide_in_from_left);
                    // Current screen goes out from right. 
                    viewFlipper.setOutAnimation(this, R.anim.slide_out_to_right);
    
                    // Display next screen.
                    viewFlipper.showNext();
                 }
    
                // Handling right to left screen swap.
                 if (lastX > currentX) {
    
                     // If there is a child (to the left), kust break.
                     if (viewFlipper.getDisplayedChild() == 1)
                         break;
    
                     // Next screen comes in from right.
                     viewFlipper.setInAnimation(this, R.anim.slide_in_from_right);
                    // Current screen goes out from left. 
                     viewFlipper.setOutAnimation(this, R.anim.slide_out_to_left);
    
                    // Display previous screen.
                     viewFlipper.showPrevious();
                 }
                 break;
             }
             return false;
        }
    }
    

    XML 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="#f5f5f5" >
    
            <ViewFlipper
                android:id="@+id/viewflipper"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_margin="6dp" >
    
    
                <LinearLayout
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:gravity="center"
                    android:orientation="vertical" >
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="15dp"
                        android:text="Windows PC"
                        android:textColor="#b7102f"
                        android:textSize="25dp">
                    </TextView>
    
                    <ImageView
                        android:layout_marginTop="15dp"
                        android:id="@+id/imageView1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:src="@drawable/windows_pc" />
                </LinearLayout>
    
    
                <LinearLayout
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:gravity="center"
                    android:orientation="vertical" >
    
                    <TextView
                        android:layout_marginTop="15dp"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="Ubuntu PC"
                        android:textColor="#191975"
                        android:textSize="25dp"
                        android:textStyle="italic" >
                    </TextView>
    
                    <ImageView
                        android:layout_marginTop="15dp"
                        android:id="@+id/imageView2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:src="@drawable/ubuntu_pc" />
    
                </LinearLayout>
            </ViewFlipper>
    </LinearLayout>
    

    所有波纹管代码都在 res/anim 目录中:

    slide_in_from_left.xml(进入屏幕):

    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate
            android:fromXDelta="-100%"
            android:toXDelta="0%"
            android:fromYDelta="0%"
            android:toYDelta="0%"
            android:duration="1500" />
    </set>
    

    slide_out_to_left.xml(见屏幕外):

      <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
          <translate
            android:fromXDelta="0%"
            android:toXDelta="-100%"
            android:fromYDelta="0%"
            android:toYDelta="0%"
            android:duration="1500"/>
    </set>
    

    slide_in_from_right.xml(进入屏幕):

     <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate
            android:fromXDelta="100%"
            android:toXDelta="0%"
            android:fromYDelta="0%"
            android:toYDelta="0%"
            android:duration="1500" />
    </set>
    

    slide_out_to_right.xml(见屏幕外):

       <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
          <translate
              android:fromXDelta="0%"
              android:toXDelta="100%"
              android:fromYDelta="0%"
              android:toYDelta="0%"
              android:duration="1500"/>
    </set>
    

    【讨论】:

      【解决方案3】:

      下载nineolddroids (http://nineoldandroids.com/) 库并阅读文档...

      您应该能够使用xxBy 方法完成任务。

      示例用法:

      private void sortCardsAndShadowAnim() {
      //        float bottom = getHeight();
          float activeCardTop;
          if (activeCardIndex == getChildCount() - 1) {
              activeCardTop = topHeaderDown;
              ViewPropertyAnimator.animate(getChildAt(activeCardIndex)).y(activeCardTop).setDuration(SORT_ANIMATION_DURATION).start();
              ViewPropertyAnimator.animate(shadows.get(activeCardIndex)).alpha(getShadowAlpha(activeCardTop)).setDuration(SORT_ANIMATION_DURATION).start();
          } else {
              for (int i = getChildCount() - 1; i > activeCardIndex + 1; i--) {
                  ViewPropertyAnimator.animate(getChildAt(i)).y(bottom).setDuration(SORT_ANIMATION_DURATION).start();
                  ViewPropertyAnimator.animate(shadows.get(i)).alpha(getShadowAlpha(bottom)).setDuration(SORT_ANIMATION_DURATION).start();
              }
      

      此代码实际上是通过 Y 轴移动视图(卡片),并在移动时将其淡出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 2017-08-03
        • 1970-01-01
        • 1970-01-01
        • 2014-12-22
        • 1970-01-01
        相关资源
        最近更新 更多