如何设置 "toXDelta" 从 java 代码翻译动画值?
How can I set "toXDelta" translate animation value from java code?
如何从 java 代码中设置 toXDelta 值?我需要先计算它,所以我不能只使用 xml 中的最终值。我可以在我的视图中使用 animate().translateX,但我无法让动画放慢速度直到结束。有什么想法吗?
下载 nineolddroids
(http://nineoldandroids.com/) 库并阅读文档...
您应该能够使用 x
或 xBy
方法完成任务。
示例用法:
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 轴移动视图(卡片),并在移动时淡出。
在翻译动画中,您可以在制作对象时发送该值。
TranslateAnimation trans = new TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta);
你在这里阅读::
public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
Added in API level 1
Constructor to use when building a TranslateAnimation from code
Parameters
fromXDelta Change in X coordinate to apply at the start of the animation
toXDelta Change in X coordinate to apply at the end of the animation
fromYDelta Change in Y coordinate to apply at the start of the animation
toYDelta Change in Y coordinate to apply at the end of the animation
希望是你的要求
可以使用Viewfiliper方法。参考是: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>
如何从 java 代码中设置 toXDelta 值?我需要先计算它,所以我不能只使用 xml 中的最终值。我可以在我的视图中使用 animate().translateX,但我无法让动画放慢速度直到结束。有什么想法吗?
下载 nineolddroids
(http://nineoldandroids.com/) 库并阅读文档...
您应该能够使用 x
或 xBy
方法完成任务。
示例用法:
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 轴移动视图(卡片),并在移动时淡出。
在翻译动画中,您可以在制作对象时发送该值。
TranslateAnimation trans = new TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta);
你在这里阅读::
public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
Added in API level 1 Constructor to use when building a TranslateAnimation from code
Parameters
fromXDelta Change in X coordinate to apply at the start of the animation
toXDelta Change in X coordinate to apply at the end of the animation
fromYDelta Change in Y coordinate to apply at the start of the animation
toYDelta Change in Y coordinate to apply at the end of the animation
希望是你的要求
可以使用Viewfiliper方法。参考是: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>