最好的学习 android 某一个 widget 的方法 就是 自己找代码 不管懂不懂,敲出来 ,然后在机子上 看到 效果 ,最后 去理解 每行代码的意思。
上述话是个人观点。哈哈
经常 见 这样的情况吧:点击退出,然后屏幕中央出现一个弹出框 ,你是否退出? 确定 取消,
我想实现这样的效果,点击确定后 ,从屏幕的两侧飞出确定 和取消按钮 一直 落在屏幕中央 渐渐出现的 board (不知怎么称呼他,就叫 board 吧)上。话说的有点乱,但就是这么个意思。
点击 确定按钮后 ,两个按钮飞走,board 消失 。
说一下 :我这里涉及到的知识有 popupwindow 的使用(包括创建 ,设置样式 等),animation 等
两个按钮属于 一个 布局文件 pop.xml,待会popupwindow 用的布局文件就是它
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dip"
android:layout_height="100dip"
android:orientation="horizontal"
android:background="@android:color/white"
android:layout_centerInParent="true"
android:id="@+id/linearLayout_container"
android:gravity="center"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="yes"
android:id="@+id/button_yes"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="no"
android:id="@+id/button_no"
/>
</LinearLayout>
下面是popupwindow 的产生:
LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View menuView = (View)mLayoutInflater.inflate(R.layout.pop, null, true);//弹出窗口包含的视图
b = (Button) menuView.findViewById(R.id.button_yes);
c = (Button) menuView.findViewById(R.id.button_no);
l = (LinearLayout) menuView.findViewById(R.id.linearLayout_container);
p = new PopupWindow(menuView, 300,200, true);//创建弹出窗口,指定大小
popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.btn_style_alert_dialog_background));//设置弹出窗口的背景
p.setAnimationStyle(R.style.mypopwindow_anim_style);//设置窗口显示的动画效果
p.showAtLocation(findViewById(R.id.root), Gravity.CENTER, 0, 0);//设置窗口显示的位置
handler.sendEmptyMessage(100);
p.update();
其中 p.setAnimationStyle(R.style.mypopwindow_anim_style);//设置窗口显示的动画效果
style 文件 如下
<style name="mypopwindow_anim_style">
<item name="android:windowEnterAnimation">@anim/popshow_anim</item> <!-- 指定显示的动画xml -->
<item name="android:windowExitAnimation">@anim/pophidden_anim</item> <!-- 指定消失的动画xml -->
<item name="android:windowBackground">@color/vifrification</item><!--背景透明-->
</style>
上面的动画效果布局文件就不说了吧,很简单
handler.sendEmptyMessage(100); 是显示 两个按钮的动画效果,如下代码:
b.setAnimation(AnimationUtil.getLeftInAnimation(getApplicationContext()));
c.setAnimation(AnimationUtil.getRightInAnimation(getApplicationContext()));
得到 Animation 的代码就不贴了,很简单的。网上一搜一坨一坨的。
好,到这里 ,popupwindow 和其中的两个按钮 动画就搞定了,下面来说 让他们 消失掉的动画。在 按钮的点击事件里
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "click", Toast.LENGTH_LONG).show();
Animation a = AnimationUtil.getLeftOutAnimation(getApplicationContext());
b.setAnimation(a);
a.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
p.dismiss();
}
});
c.setAnimation(AnimationUtil.getRightOutAnimation(getApplicationContext()));
}
这里说一下,当 dismiss的时候调用 popupwindow 的退出动画,而当 dismiss ,两个按钮的动画效果就没了 ,到这里 我需要实现的效果就完全好了,有需要深挖掘的童鞋可以继续看看,有时间了,我在搞搞。