다음 코드를 사용하여 버튼을 부풀려서 간단하게 TranslateAnimation
을 사용하여 선택한 2 개의 버튼의 위치를 바꾸고 싶습니다.Android : 팽창 된 버튼의 ID 찾기
번호 :
for (int k = 1; k <= quotient; k++)
{
LinearLayout.LayoutParams params3 = new LinearLayout.LayoutParams(button_width,row_height);
params3.setMargins(button_margin, button_margin, button_margin, button_margin);
btn_right = new Button(this);
btn_right.setId(idd);
final int id_ = btn_right.getId();
btn_right.setText(""+question[idd]);
frame_row.addView(btn_right, params3);
btn_right.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
btn_right = ((Button) findViewById(id_));
X1 = getRelativeLeft(btn_right);
Y1 = getRelativeTop(btn_right);
int b = Integer.parseInt(""+btn_right.getText().toString());
selection ++;
if (selection%2 ==1)
{
selected_id1 = id_;
selected_color1 = b;
custom_toast("X1=" +X1 + "\nY1=" + Y1);
}
else
{
selected_id2 = id_;
selected_color2 = b;
X2 = getRelativeLeft(btn_right);
Y2 = getRelativeTop(btn_right);
custom_toast("X2=" +X2 + "\nY2=" + Y2);
// the first one
btn_right = ((Button) findViewById(selected_id1));
anim1=new TranslateAnimation(0, (X2-X1), 0, (Y2-Y1));
anim1.setFillAfter(true);
anim1.setDuration(animationTime);
anim1.setAnimationListener(Game.this);
btn_right.startAnimation(anim1);
// the second one
btn_right = ((Button) findViewById(selected_id2));
anim2=new TranslateAnimation(0, (X1-X2), 0, (Y1-Y2));
anim2.setFillAfter(true);
anim2.setDuration(animationTime);
anim2.setAnimationListener(Game.this);
btn_right.startAnimation(anim2);
}
@Override
public void onAnimationEnd(Animation animation)
{
if (animation == anim1)
{
custom_toast("1 clear");
btn_right = ((Button) findViewById(selected_id1));
btn_right.clearAnimation(); // Line 426
}
if (animation == anim2)
{
custom_toast("2 clear");
btn_right = ((Button) findViewById(selected_id2));
btn_right.clearAnimation();
}
}
로그 캣 :
04-21 21:28:00.728: E/AndroidRuntime(11341): java.lang.NullPointerException
04-21 21:28:00.728: E/AndroidRuntime(11341): at com.abc.abc.Game.onAnimationEnd(Game.java:426)
질문 : 정보에
, 선택 % 2 == 1, 그것은 사용자가 첫 번째 버튼을 누를 것이다했음을 의미한다면 스왑 용으로 아직 준비되지 않았으므로 ID와 해당 X, Y 좌표를 기록해야합니다. % 2 == 0을 선택하면 사용자가 2 개의 버튼을 눌러 2 번째 X 및 Y를 기록한 후 교체 할 준비가되었음을 의미합니다.
또한 (X1, Y1) 및 (X2, Y2) .
이것은 426 btn_right.clearAnimation();
(위에서 지정한대로)의 NPE로 실행됩니다. 내 질문은, 모든 버튼이 부풀려 졌기 때문에, 그리고 나는 팽창 된 모든 버튼에 대해 이미 설정했기 때문에, 라인 426에서 NPE가 여전히 부족한 것인데, 실제로 사용자가 터치 한 2 개의 버튼을 어떻게 지정해야합니까? 스와핑 애니메이션을 구현하는 방법은 무엇입니까?
감사합니다.