今天要模仿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();
}
}