2013-04-10 65 views
28

我正在使用objectAnimator在Android中從底部到頂部爲按鈕設置動畫效果。現在,我使用下面的代碼如何在Android中的ObjectAnimator中給出百分比值

ObjectAnimator transAnimation = ObjectAnimator.ofFloat(button,"translationY",0,440); 
     transAnimation.setDuration(440); 
     transAnimation.start(); 

我也試圖與下面的示例代碼。但仍存在問題

ObjectAnimator transAnimation = ObjectAnimator.ofFloat(loginLayout, "translationY",0f,0.8f); 
        transAnimation.setDuration(480); 
        transAnimation.start(); 

它可以在大屏幕設備的罰款。但是當涉及到小屏幕設備時,屏幕就會熄滅。無論屏幕大小如何,我都希望將其保留在屏幕的頂部。我想我必須給出百分比值(比如0%到100%或0到100%p)。所以我的問題是如何在Android中的objectAnimator中給出百分比值。我還注意到了一件事,即這個objectAnimator僅在HoneyComb中引入。那麼是否有任何向後兼容庫可以在低版本中運行它。任何人都可以指導我爲此找到解決方案。

我也試過擴展查看和編寫offset()屬性的getter和setter。它仍然不能完全移動到屏幕頂部。這是我用過的代碼。

@SuppressLint("NewApi") public float getXFraction() 
    { 
     int width = context.getWindowManager().getDefaultDisplay().getHeight(); 
     return (width == 0) ? 0 : (getY()); 
    } 

    @SuppressLint("NewApi") public void setXFraction(float xFraction) { 
     int width = context.getWindowManager().getDefaultDisplay().getWidth(); 
     setY((width > 0) ? (width) : 0); 
    } 

感謝inAdvance

+1

對於那些正在尋找答案的人來說,[這裏](http://stackoverflow.com/a/11015834/1083957)是解決方法。 – azizbekian 2015-09-17 16:37:21

回答

7

對蜂窩式預設備使用ObjectAnimator添加NineOldAndroids庫到您的項目,改變你的進口使用com.nineoldandroids.animation.ObjectAnimator

要使用的百分比值ObjectAnimator,而不是getXFractionsetXFraction你必須添加這樣

public float getYFraction() { 
    final WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); 
    int height = wm.getDefaultDisplay().getHeight(); 
    return (height == 0) ? 0 : getY()/(float) height; 
} 

public void setYFraction(float yFraction) { 
    final WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); 
    int height = wm.getDefaultDisplay().getHeight(); 
    setY((height > 0) ? (yFraction * height) : 0); 
} 

getYFractionsetYFraction方法,然後你可以這樣

<?xml version="1.0" encoding="utf-8"?> 
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="500" 
    android:propertyName="yFraction" 
    android:valueFrom="0" 
    android:valueTo="0.8" 
    android:valueType="floatType" /> 

或者創建XML文件project-folder/res/animator/move_bottom.xml在代碼中創建動畫

final LoginLayout loginLayout = (LoginLayout) findViewById(R.id.login_layout); 
final ObjectAnimator oa = ObjectAnimator.ofFloat(loginLayout, "yFraction", 0f, 0.8f); 
oa.start(); 
+0

的確我嘗試了這個...但它仍然熄滅..還有一件事情突然發生在屏幕上方,然後又回到了底部。爲什麼會發生?在objectAnimator類中是否有像setFillAfter =「true」這樣的方法在終點停止它,而不是返回到原始位置。 – 2013-04-20 06:27:56

+0

我認真地認爲我在浮點(target,propertyName,int,int)方法中犯了一些錯誤;最後兩個參數是int,int。這些參數決定了動畫的起點和終點。但在什麼單位的方法是期待值...我的意思是它是否期望像素或在DP。當我找到設備的屏幕高度並將值傳遞給ofFloat()方法時,爲什麼它不工作。它仍然超越了屏幕。爲什麼??請讓我知道你的想法和建議。我做錯了什麼? – 2013-04-22 02:15:29

+0

在'ofFloat'方法中,最後兩個或更多個參數是float。查看官方文檔[here](http://developer.android.com/reference/android/animation/ObjectAnimator.html#ofFloat%28java.lang.Object,%20java.lang.String,%20float...%29) – vasart 2013-04-22 07:32:00

2

如果您想使用ObjectAnimator從屏幕外部創建動畫。您可以使用Android顯示大小來做到這一點。

@Override 
    public void onCreate(Bundle savedInstanceState) { 

     ... 

     sampleImage = BitmapFactory.decodeResource(getResources(), R.drawable.sample); 

     myImage = (ImageView) findViewById(R.id.image_view); 
     myImage.setImageBitmap(sampleImage); 

     //In case API Level is 14 above. 
     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     float displayWidth = size.x; 

     //In case API Level is 13 below.  
     //WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     //Display display = wm.getDefaultDisplay(); 
     //displayWidth = display.getWidth(); 

     animator = ObjectAnimator.ofFloat(myImage, "translationX", displayWidth, 0); 
     animator.setDuration(500); 

    } 

對不起,如果我的建議錯過了這一點。

2

嘗試使用自定義屬性爲ObjectAnimator,而不是創建包含自定義屬性自定義視圖,您可以創建一個接受一個「分數」的自定義屬性:

Property<View, Float> property = new Property<View, Float>(Float.TYPE, "translation_x_fraction") { 
     @Override public Float get(View view) { 
      return view.getWidth() <= 0 ? 0 : view.getTranslationX()/view.getWidth(); 
     } 

     @Override public void set(View view, Float value) { 
      view.setTranslationX(view.getWidth() * value); 
     } 
} 

ObjectAnimator.ofFloat(view, property, 0f, 1f); 
0

我已經這樣做了,我花了太多很多時間,但它會節省你的時間。

參數:

  1. 查看(您的支持視圖)
  2. 家長寬度(視圖的根)
  3. 兒童寬度(您想申請動畫)
  4. (多少百分比標籤e你想移動你的物體或視圖)

不要害怕與參數,我在這裏通過示例來解釋。

XMLJAVA代碼:

activity_main.xml中

<LinearLayout 
    android:id="@+id/llProgressParent" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_margin="5dp" 
    android:layout_gravity="center" 
    android:orientation="horizontal" 
    android:weightSum="1" > 

    <View 
     android:id="@+id/viewSuppot" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="0" > 
    </View> 

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

</LinearLayout> 

MainActivity.java

private LinearLayout llProgressParent; 
private View viewSuppot; 
private ImageView ivProgressChild; 
private int childWidth, parentWidth; 
private int percentage = 75; 

的onCreate()

viewSuppot = findViewById(R.id.viewSuppot); 

llProgressParent = (LinearLayout)findViewById(R.id.llProgressParent); 
llProgressParent.post(new Runnable() { 
     @Override 
     public void run() { 
      parentWidth = llProgressParent.getMeasuredWidth(); 
     } 
    }); 


ivProgressChild = (ImageView)findViewById(R.id.ivProgressChild); 
ivProgressChild.post(new Runnable() { 
     @Override 
     public void run() { 
      childWidth = ivProgressChild.getMeasuredWidth(); 
     } 
    }); 

方法:

private void animateViewByPercentageOrProgrss(final View view, int parentWidth, int childWidth, int percentage){ 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     ValueAnimator anim = ValueAnimator.ofInt(view.getMeasuredWidth(), (int) (((float) percentage * parentWidth)/100)-(childWidth/2)); 
     anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
      @Override 
      public void onAnimationUpdate(ValueAnimator valueAnimator) { 
       int val = (Integer) valueAnimator.getAnimatedValue(); 
       ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); 
       layoutParams.width = val; 
       view.setLayoutParams(layoutParams); 
      } 
     }); 
     anim.setDuration(2000); 
     anim.start(); 
    } 

如何調用方法

animateViewByPercentageOrProgrss(viewSuppot, parentWidth, childWidth, percentage); 

對其做