我正在尝试交换两个按钮的位置。 我的交换代码看起来是:
private void exchangeButtons(Button btn1, Button btn2) {
// Create the animation set
AnimationSet exchangeAnimation = new AnimationSet(true);
TranslateAnimation translate = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, btn2.getLeft(),
Animation.RELATIVE_TO_SELF, btn1.getLeft(),
Animation.RELATIVE_TO_SELF, btn2.getRight(),
Animation.RELATIVE_TO_SELF, btn1.getRight());
translate.setDuration(500);
exchangeAnimation.addAnimation(translate);
//int fromX = btn1.getLeft();
//int fromY = btn1.getRight();
//int toX = btn2.getLeft();
//int toY = btn2.getRight();
Log.d("ArrangeMe",
"view1 pos:" + btn1.getLeft() + ",
" +btn1.getRight() + "view2 pos:" +
btn2.getLeft() + ", " + btn2.getRight());
AnimationSet exchangeAnimation1 = new AnimationSet(true);
TranslateAnimation translate1 = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, btn1.getLeft(),
Animation.RELATIVE_TO_SELF, btn2.getLeft(),
Animation.RELATIVE_TO_SELF, btn1.getRight(),
Animation.RELATIVE_TO_SELF, btn2.getRight());
translate1.setDuration(500);
exchangeAnimation1.addAnimation(translate1);
// EXECUTE btn1.startAnimation(exchangeAnimation);
btn2.startAnimation(exchangeAnimation1);
}
我将代码调用如下:
exchangeButtons(button1, button2);
我的布局如下所示:
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:text="One"
android:id="@+id/button1"
android:layout_height="70px"
android:layout_width="70px"
android:layout_weight="1">
</Button>
<Button
android:text="Two"
android:id="@+id/button2"
android:layout_height="70px"
android:layout_width="70px"
android:layout_weight="1">
</Button>
</LinearLayout>
执行代码时会发生什么:
而不是交换位置的按钮,它们只会消失一段时间[可能是500毫秒]并重新出现,就像它们最初一样。
如何解决此问题?它能在设备中正常工作吗?
答案 0 :(得分:3)
您不会在onCreate中获取getRight值,因为尚未在屏幕上绘制UI,因此尚未测量任何UI元素。试试这个
ViewTreeObserver vto = btn1.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
btn1.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int left = btn1.getLeft();
}
});
将代码放入onCreate方法
答案 1 :(得分:1)
Android的TranslateAnimation
不会重新定位您的组件,它只会动画您想要进行的转换 - 之后,您可以更改组件的布局参数(请查看此{{3} }})。
P.S。您可以直接使用平移动画,而无需使用全新的动画集。另一件好事是在布局膨胀时创建动画,并覆盖onSizeChanged(int, int, int, int)
以使用新尺寸重新创建动画。
您使用的布局是什么?
答案 2 :(得分:0)
b4.setOnClickListener {
try {
var arswap = arrayListOf<Button>(b1, b2, b3);
var randomPos: Int = 0;
fun swap(b1: Button, b2: Button) {
var tempPosition = Point(b1.x.toInt(), b1.y.toInt())
b1.x = b2.x;
b1.y = b2.y;
b2.x = tempPosition.x.toFloat();
b2.y = tempPosition.y.toFloat();
}
var totalItems: Int = 3; // total number of items
for (i in 0..totalItems/3 ) {
randomPos = ((Math.random() * arswap.size).toInt());
var randomItem = ((Math.random() * ((totalItems / 2) - 1)) + ((totalItems / 2) + 1));
swap(arswap[randomPos], arswap[randomItem.toInt()])
}
}catch (e:Exception){
}
}