Android-自定义popupwindow详解(包含动画简单讲解)
2016-08-14 23:00
369 查看
我们知道在很多需求的时候都要求有对话框的,我们也知道dialog和popupwindow都可以实现。但是,popupwindow是弹框的万能之法,当然dialog的集成度,所继承的相关方法也给予一定便利。关于dialog的自定义上篇文章有详细介绍,本篇文章将详解popupwindow的自定义(糅合动画)。
先上图,就是做成这个带有弹出的动画的popupwindow
![](http://img.blog.csdn.net/20160814221030752)
下面将进行代码的详解
大体思路:就是继承popupwindow,获得构造器,接入自定义布局,设置弹框属性
1.popupwindow的java文件:
import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.drawable.ColorDrawable; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.PopupWindow; import com.android.administrator.childrensittingposture.R; import com.android.administrator.childrensittingposture.activity.HistoryActivity; import com.android.administrator.childrensittingposture.activity.SettingActivity; /** * Created by 符柱成 on 2016/7/24. */ public class MyPopWindow extends PopupWindow { private View conentView; private Activity context; public MyPopWindow(final Activity context) { super(context); this.context = context; this.initPopupWindow(); } private void initPopupWindow() { //使用view来引入布局 LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); conentView = inflater.inflate(R.layout.popuo_dialog, null); //获取popupwindow的高度与宽度 int h = context.getWindowManager().getDefaultDisplay().getHeight(); int w = context.getWindowManager().getDefaultDisplay().getWidth(); // 设置SelectPicPopupWindow的View this.setContentView(conentView); // 设置SelectPicPopupWindow弹出窗体的宽 this.setWidth(w / 2 + 50); // 设置SelectPicPopupWindow弹出窗体的高 this.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT); // 设置SelectPicPopupWindow弹出窗体可点击 this.setFocusable(true); this.setOutsideTouchable(true); // 刷新状态 this.update(); // 实例化一个ColorDrawable颜色为半透明 ColorDrawable dw = new ColorDrawable(0000000000); // 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作 this.setBackgroundDrawable(dw); // mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog); // 设置SelectPicPopupWindow弹出窗体动画效果,设置动画,一会会讲解 this.setAnimationStyle(R.style.AnimationPreview); //布局控件初始化与监听设置 LinearLayout llayout_remind = (LinearLayout) conentView .findViewById(R.id.llayout_remind); LinearLayout llayout_history = (LinearLayout) conentView .findViewById(R.id.llayout_history); llayout_remind.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { } }); llayout_history.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); } /** * 显示popupWindow的方式设置,当然可以有别的方式。 *一会会列出其他方法 * @param parent */ public void showPopupWindow(View parent) { if (!this.isShowing()) { // 以下拉方式显示popupwindow this.showAsDropDown(parent, parent.getLayoutParams().width / 2, 18); } else { this.dismiss(); } } }
列出其他的popupwindow显示方法:都是封装好了的方法,尽情使用吧
/** * 第一种 * 显示在控件的下右方 * * @param parent parent */ public void showAtDropDownRight(View parent) { if (parent.getVisibility() == View.GONE) { this.showAtLocation(parent, 0, 0, 0); } else { // x y int[] location = new int[2]; //获取在整个屏幕内的绝对坐标 parent.getLocationOnScreen(location); this.showAtLocation(parent, 0, location[0] + parent.getWidth() - this.width, location[1] + parent.getHeight()); } } /** 第二种 * 显示在控件的下中方 * * @param parent parent */ public void showAtDropDownCenter(View parent) { if (parent.getVisibility() == View.GONE) { this.showAtLocation(parent, 0, 0, 0); } else { // x y int[] location = new int[2]; //获取在整个屏幕内的绝对坐标 parent.getLocationOnScreen(location); this.showAtLocation(parent, 0, location[0] / 2 + parent.getWidth() / 2 - this.width / 6, location[1] + parent.getHeight()); } } /** 第三种 * 显示在控件的下左方 * * @param parent parent */ public void showAtDropDownLeft(View parent) { if (parent.getVisibility() == View.GONE) { this.showAtLocation(parent, 0, 0, 0); } else { // x y int[] location = new int[2]; //获取在整个屏幕内的绝对坐标 parent.getLocationOnScreen(location); this.showAtLocation(parent, 0, location[0], location[1] + parent.getHeight()); } }
popupwindow的布局文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="vertical" android:background="@color/blue"> <LinearLayout android:id="@+id/pop_layout2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:background="@color/white" android:gravity="center_horizontal" android:orientation="vertical" > <LinearLayout android:id="@+id/llayout_remind" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="8dp" > <ImageView android:layout_width="35dp" android:layout_height="35dp" android:scaleType="fitCenter" android:src="@drawable/remind" /> <TextView android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginLeft="10dp" android:gravity="center" android:text="自动提醒设置" android:textColor="@color/white" android:textSize="15dip" /> </LinearLayout> <TextView android:layout_width="fill_parent" android:layout_height="0.2dp" android:background="@color/white" /> <LinearLayout android:id="@+id/llayout_history" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="8dp" > <ImageView android:layout_width="35dp" android:layout_height="35dp" android:scaleType="fitCenter" android:src="@drawable/history" /> <TextView android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginLeft="10dp" android:gravity="center" android:text="历史记录统计" android:textColor="@color/white" android:textSize="15dip" /> </LinearLayout> </LinearLayout> </RelativeLayout>
此外我们不要忘了,我们是给这个popupwindow设置了动画的喔:style文件:这里作为资源来自定义样式
<style name="AnimationPreview"> <item name="android:windowEnterAnimation">@anim/in</item> <item name="android:windowExitAnimation">@anim/out</item> </style>
保存动画的文件在另一个地方
用图说明
![](http://img.blog.csdn.net/20160814223253262)
下面就给出动画文件的代码啦:
<?xml version="1.0" encoding="utf-8"?> <!-- 对话框出来时的动画--> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="0.001" android:toXScale="1.0" android:fromYScale="0.001" android:toYScale="1.0" android:pivotX="100%" android:pivotY="10%" android:duration="200" /> <!--fromXScale与toXScale是指一开始的时候在x方向上的缩放比例和在结束时候的比例,1.0就是原本的样子。同理fromYScale和 toYScale--> <!--pivotX和pivotY是指动画开始的位置 起始动画的x和y位置-->
<?xml version="1.0" encoding="utf-8"?> <!-- 对话框消失时的动画--> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="0.001" android:fromYScale="1.0" android:toYScale="0.001" android:pivotX="100%" android:pivotY="10%" android:duration="200" />
好了,popupwindow的自定义思路详解完成,并且在期间列出一些扩展性的可能和讲解了这个动画的实现。
本文参考了:老妖的博客http://blog.csdn.net/wwj_748/article/details/25653409欢迎在下方指出错误,共同学习!
转载请注明:【JackFrost的博客】
相关文章推荐
- android自定义SlideMenu源码详解之最简单侧滑实现
- android自定义加载数据动画dialog和简单的timer计时器
- Android安卓用Dialog对话框简单并且完美实现popupWindow底部弹出效果,有动画效果
- Android 自定义activity切换动画实现,overridePendingTransition的使用详解
- Android简单实现自定义弹框(PopupWindow)
- Android中的动画详解系列【3】——自定义动画研究
- Android中自定义PopupWindow实现弹出框并带有动画效果
- Android自定义ViewGroup(侧滑菜单)详解及简单实例
- Android 修改原生NumberPicker数字选择器的分隔线颜色、文字颜色和大小,同时利用PopupWindow和补间动画自定义弹出效果
- Android自定义view半圆形"错误提示框"和简单动画使用
- Android自定义一个简单的动画加载页面
- android视图动画、属性动画、自定义动画、5.X SVG矢量动画机制详解
- Android 自定义PopupWindow动画效果
- 一个简单的Android自定义view详解
- Android中的动画详解系列【3】——自定义动画研究
- android简单的自定义动画
- Android自定义主题样式详解(结合自定义title栏讲解)
- Android自定义搜索时的关键字气泡动画-原理详解
- Android动画最新最全详解包含Material Design动画
- 关于Android动画插值器的简单介绍以及如何自定义自己的插值器