G_MAN G_MAN - 1 month ago 27
Android Question

Android: move imageView thats lay on window manager with animation

a have some problem and didn't find a solution. The problem is, i have a image view that's lay on layout and this layout lay on window manager, this image view is clickable. This image view have to move to right and to the left and be clickable. Here is my code

`public class FloatingAnimationService extends Service {

private WindowManager windowManager;

private ImageView floatingUnit;

private boolean isClicked;

public void onCreate() {

super.onCreate();

isClicked = false;

floatingUnit = new ImageView(this);
//a unit as imageView
Picasso.with(this).load(new File(Environment.getExternalStorageDirectory().getPath() +"/" + "cat.png")).into(floatingUnit);

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(AppMethods.getPxFromDp(120 ,this), AppMethods.getPxFromDp(120 , this));
floatingUnit.setLayoutParams(layoutParams);
final LinearLayout floatingUnitLayout = new LinearLayout(this);

floatingUnitLayout.addView(floatingUnit);

windowManager = (WindowManager) this.getSystemService(WINDOW_SERVICE);
//here is all the science of params

final LayoutParams myParams = new WindowManager.LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,
LayoutParams.TYPE_PHONE,
LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
myParams.gravity = Gravity.TOP | Gravity.LEFT;
myParams.x=0;
myParams.y=100;


windowManager.addView(floatingUnitLayout, myParams);



// add a floatingUnit icon in window

Animation animation = AnimationUtils.loadAnimation(this ,R.anim.floating_unit_animation);



floatingUnit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startQuestion();
stopSelf();
windowManager.removeViewImmediate(floatingUnitLayout);
isClicked = true;

}
});
floatingUnit.startAnimation(animation);
startAnimationTimer(floatingUnitLayout);

AnimationSet animationSet = new AnimationSet(true);

myParams.x = 100;
myParams.y = 100;
windowManager.updateViewLayout(floatingUnitLayout, myParams);

Animation animationToRight = AnimationUtils.loadAnimation(this ,R.anim.left_to_right_animation);
Animation animationToLeft = AnimationUtils.loadAnimation(this , R.anim.right_to_left_animation);

animationSet.addAnimation(animationToRight);

floatingUnit.startAnimation(animation);
}

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

private void startQuestion (){

Intent intentQuestionActivity = new Intent(this, QuestionActivity.class);
intentQuestionActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intentQuestionActivity);

}

private void startAnimationTimer(final View floatingUnitLayout){


long animationLifeTime = 10000;
new CountDownTimer(animationLifeTime, 1000) {

public void onTick(long millisUntilFinished) {
Log.i("animation remaining: " , Long.toString(millisUntilFinished / 1000));

}

public void onFinish() {
Log.i("animation: " , "DONE");
if(!isClicked) {
windowManager.removeViewImmediate(floatingUnitLayout);
stopSelf();
}
}
}.start();


}


`
Please help. Thanks !

Answer

Thanks all . Found the solution by myself. The trick is: to move a image that lay on window manager, you have to update the Layout Params.

here is the code below

 private void startAnimationTimer(final View floatingUnitLayout) {

    long animationLifeTime = AppData.first(AppData.class).getCountSecondsPicShow();
    countDownTimer = new CountDownTimer(animationLifeTime, 100) {

        public void onTick(long millisUntilFinished) {

            Log.i("animation remaining: ", Long.toString(millisUntilFinished / 1000));
            myParams.x = myParams.x + 2;
            myParams.y = myParams.y + 2;
            windowManager.updateViewLayout(floatingUnitLayout, myParams);


        }

        public void onFinish() {
            Log.i("animation: ", "DONE");
            if (!isClicked) {

                windowManager.removeViewImmediate(floatingUnitLayout);
                stopSelf();
            }
        }
    }.start();


}