Control widget position

控制控件位置

實現物件移動方法,使用Math.sin去做一個曲線讓物件可以順暢的上下位移。

activity_main.xml - 只要拉出一個Button 即可。

1
2
3
4
5
<Button
android:id="@+id/button2"
android:layout_width="80dp"
android:layout_height="80dp"
android:text="Button" />

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Button btn2;
int values = 1;
boolean isRunning = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn2 = (Button) findViewById(R.id.button2);
btn2.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (isrunning)
{
isRunning = false;
nhandler.removeCallbacks(runnable);
} else {
isRunning = true;
nhandler.post(runnable);
}
}
});
}
Handler nhandler = new Handler();
Runnable runnable = new Runnable()
{
@Override
public void run()
{
if (values < 190)
{
float fff = (float) (Math.sin((double) values * 0.1) * 50) + btn2.getTop();
btn2.setY(fff);
values++;
} else {
values = 1;
}
nhandler.postDelayed(this, 10);
}
};

實現效果

思路

透過HandlerRunnable來達成不斷移動的效果
重點在於 -> Math.sin((double) values * 0.1) * 50
因為sin帶入1,2,3數值會是正數,當數值增加到4,5,6的時候數值會變成負數
所以values * 0.1 是為了讓物體位移的距離更小,達成一個滑順的位移效果
而在後面的* 50 則是為了讓移動幅度增加的一個附加值。


移動的物體

如果可以上下移動,那只要控制X軸,那就能左右移動囉!!

這邊使用的是Tangent,因為Tangent的曲線是平穩->急昇
( 可以讓物體由慢到快的移動 )

實現的部分,程式碼多加上一點點東西即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Handler nhandler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run()
{
if (values < 190)
{
float fff = (float) (Math.sin((double) values * 0.1) * 50) + btn2.getTop();
float ttt = (float) (Math.tan((double) values * 0.01) * 50);
btn2.setY(fff);
btn2.setX(ttt);
values++;
} else {
values = 1;
}
nhandler.postDelayed(this, 10);
}
};

實現效果 ( Gif有點 lag請見諒 )

文章目錄
  1. 1. 控制控件位置
    1. 1.0.1. 思路
    2. 1.0.2. 移動的物體
|