今天要模仿android抽屉实现,功能如下:
点击,然后缓缓弹出窗口,然后再次点击,缓缓收回窗口.
有几个要点,使用TranslateAnimation传入的参数new TranslateAnimation(fromXDelta,toXDelta,fromYDelta,toYDelta);
其中的xy,是指你要animate的view的左上角坐标
新开线程处理message
thread = new HandlerThread("animatethread");
thread.start();
animateHandler = new Handler(thread.getLooper()){
@Override
public void handleMessage(Message msg) {
if(msg.what == START_CAL_ANIMATE_DOWN){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message rmsg = new Message();
rmsg.what = ANIMATE_DOWN;
rmsg.setTarget(mHandler);
rmsg.sendToTarget();
}
if(msg.what == START_CAL_ANIMATE_UP){
Message rmsg = new Message();
rmsg.what = ANIMATE_UP;
rmsg.setTarget(mHandler);
rmsg.sendToTarget();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message dmsg = new Message();
dmsg.what = ANIMATE_DISAPPEAR;
dmsg.setTarget(mHandler);
dmsg.sendToTarget();
}
}
};
下面的是根据接受handlerThread返回的message.what,执行相应的操作.(注只能在主线程操作view,不然会报错,但也有时候可以运行通过.)
if(flag == ANIMATE_DOWN){ view.layout(view.getLeft(), screenHeight/2, view.getRight(), screenHeight/2+view.getHeight()); hasDown = true; } else if(flag == ANIMATE_UP){ trans = new TranslateAnimation(0.0f, 0.0f, 0.0f, -screenHeight/2); trans.setDuration(1000); trans.setInterpolator(context, android.R.anim.linear_interpolator); rLayout.startAnimation(trans); } if(flag == ANIMATE_DISAPPEAR){ transientView.setVisibility(View.GONE); view.layout(view.getLeft(), 0, view.getRight(), 0+view.getHeight()); hasDown = false; }
最后是点击事件
public void onClick(View view) { this.view = view; handle(); startTime = System.currentTimeMillis(); if(!hasDown){ Message msg = new Message(); msg.what = START_CAL_ANIMATE_DOWN; msg.setTarget(animateHandler); msg.sendToTarget(); trans = new TranslateAnimation(0.0f,0.0f,-screenHeight/2,0); trans.setDuration(1000); trans.setInterpolator(context, android.R.anim.linear_interpolator); rLayout.startAnimation(trans); transientView.setVisibility(View.VISIBLE); } else{ Message msg = new Message(); msg.what = START_CAL_ANIMATE_UP; msg.setTarget(animateHandler); msg.sendToTarget(); } }