Android自定义PopupWindow 动画
来源:互联网 发布:肖申克的救赎知乎影评 编辑:程序博客网 时间:2024/06/05 07:08
在公司项目中需要自定义PopupWindow,在這里记录下,方便以后可以查看,自定义PopupWindow 主要的难点是显示的位置在哪里,在這里也有讲解到,代码上传下,动画文件的代码就不上了,有要求的可以去這个地址下载:
demo 下载: http://download.csdn.net/detail/pigseesunset/9704740
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context="com.testopensourceapplication.popwindondemo.MainActivity"> <LinearLayout android:id="@+id/ll_hud_dismiss_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:background="#000000" android:gravity="center" android:orientation="horizontal" android:visibility="visible" android:weightSum="4"> <TextView android:id="@+id/fg_tv_hud_exit_navi" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/control_bg" android:clickable="true" android:focusable="true" android:focusableInTouchMode="true" android:gravity="center" android:nextFocusDown="@+id/fg_tv_hud_switch_model" android:nextFocusLeft="@+id/fg_tv_hud_see_plan" android:nextFocusRight="@+id/fg_tv_hud_switch_model" android:nextFocusUp="@+id/fg_tv_hud_see_plan" android:text="退出导航" android:textColor="#ffffff" android:textSize="30sp" /> <TextView android:id="@+id/fg_tv_hud_switch_model" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/control_bg" android:clickable="true" android:focusable="true" android:gravity="center" android:nextFocusDown="@+id/fg_tv_hud_nearby_addr" android:nextFocusLeft="@+id/fg_tv_hud_exit_navi" android:nextFocusRight="@+id/fg_tv_hud_nearby_addr" android:nextFocusUp="@+id/fg_tv_hud_exit_navi" android:text="模式切换" android:textColor="#ffffff" android:textSize="30sp" /> <TextView android:id="@+id/fg_tv_hud_nearby_addr" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/control_bg" android:clickable="true" android:focusable="true" android:gravity="center" android:nextFocusDown="@+id/fg_tv_hud_see_plan" android:nextFocusLeft="@+id/fg_tv_hud_switch_model" android:nextFocusRight="@+id/fg_tv_hud_see_plan" android:nextFocusUp="@+id/fg_tv_hud_switch_model" android:text="附近" android:textColor="#ffffff" android:textSize="30sp" /> <TextView android:id="@+id/fg_tv_hud_see_plan" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/control_bg" android:clickable="true" android:focusable="true" android:gravity="center" android:nextFocusDown="@+id/fg_tv_hud_exit_navi" android:nextFocusLeft="@+id/fg_tv_hud_nearby_addr" android:nextFocusRight="@+id/fg_tv_hud_exit_navi" android:nextFocusUp="@+id/fg_tv_hud_nearby_addr" android:text="全览图" android:textColor="#ffffff" android:textSize="30sp"/> </LinearLayout></FrameLayout>
hud_menu.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/left_side_bg" android:orientation="vertical" android:weightSum="4"> <TextView android:id="@+id/hm_tv_nearby_bank" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@drawable/control_bg" android:clickable="true" android:focusable="true" android:gravity="center" android:nextFocusDown="@+id/hm_tv_search_parking_lot" android:nextFocusLeft="@+id/hm_im_close_pop" android:nextFocusRight="@+id/hm_tv_search_parking_lot" android:nextFocusUp="@+id/hm_im_close_pop" android:text="银行" android:textColor="#ffffff" android:textSize="25sp" /> <TextView android:id="@+id/hm_tv_search_parking_lot" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@drawable/control_bg" android:clickable="true" android:focusable="true" android:gravity="center" android:nextFocusDown="@+id/hm_tv_search_gas_station" android:nextFocusLeft="@+id/hm_tv_nearby_bank" android:nextFocusRight="@+id/hm_tv_search_gas_station" android:nextFocusUp="@+id/hm_tv_nearby_bank" android:text="停车场" android:textColor="#ffffff" android:textSize="25sp" /> <TextView android:id="@+id/hm_tv_search_gas_station" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@drawable/control_bg" android:clickable="true" android:focusable="true" android:gravity="center" android:nextFocusDown="@+id/hm_tv_search_hotel" android:nextFocusLeft="@+id/hm_tv_search_parking_lot" android:nextFocusRight="@+id/hm_tv_search_hotel" android:nextFocusUp="@+id/hm_tv_search_parking_lot" android:text="加油站" android:textColor="#ffffff" android:textSize="25sp" /> <TextView android:id="@+id/hm_tv_search_hotel" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@drawable/control_bg" android:clickable="true" android:focusable="true" android:gravity="center" android:nextFocusDown="@+id/hm_im_close_pop" android:nextFocusLeft="@+id/hm_tv_search_gas_station" android:nextFocusRight="@+id/hm_im_close_pop" android:nextFocusUp="@+id/hm_tv_search_gas_station" android:text="酒店" android:textColor="#ffffff" android:textSize="25sp" /></LinearLayout>
CustomerPopWindow.class
package com.testopensourceapplication.popwindondemo;import android.app.Activity;import android.view.Gravity;import android.view.View;import android.widget.PopupWindow;/** * Created by HE on 2016/12/7. */public class CustomerPopWindow extends PopupWindow { /** * * @param context 上下文对象 * @param layout PopupWindow的View * @param popWidth PopupWindow的宽 * @param popHight PopupWindow的高 * @param PointView 指定控件 * @param gravity 指定位置 * @param animationStyle 动画类型 没有填-1 * @param Xpixl x轴偏移量(偏移量要自己根据界面坐标算) * @param Ypixl y轴偏移量(偏移量要自己根据界面坐标算) */ public CustomerPopWindow(final Activity context,View layout, int popWidth,int popHight,View PointView, int gravity,int animationStyle,int Xpixl,int Ypixl ){{ // 设置 PopupWindow的View this.setContentView(layout); //设置弹出窗体的宽高 this.setWidth(popWidth); this.setHeight(popHight); //设置弹出窗体可点击 this.setFocusable(true); this.setOutsideTouchable(true); //刷新状态 this.update(); this.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.left_side_bg)); //窗体显示的位置 showAtCustomerLocation(PointView, gravity, animationStyle, Xpixl, Ypixl); } } /** * * @param PointView 指定控件 * @param gravity 指定位置 * @param direction 控件显示的位置 * @param Xpixl x轴偏移量 * @param Ypixl y轴偏移量 */ public void showAtCustomerLocation(View PointView, int gravity, int direction, int Xpixl, int Ypixl){ //指定控件上面显示 if(gravity== Gravity.NO_GRAVITY){ int[] location = new int[2];//指定控件的坐标,界面左上角是(0,0),记住这一点,具体什么方向显示就easy了 PointView.getLocationOnScreen(location); switch (direction) { case 0://指定控件左面显示: this.setAnimationStyle(R.style.popwin_anim_style_left); this.showAtLocation(PointView, Gravity.NO_GRAVITY, location[0] - this.getWidth() + Xpixl, location[1] + Ypixl); break; case 1://指定控件右面显示: this.setAnimationStyle(R.style.popwin_anim_style_right); this.showAtLocation(PointView, Gravity.NO_GRAVITY, location[0] + this.getWidth() + Xpixl, location[1] + Ypixl); return; case 2://指定控件上面显示: this.setAnimationStyle(R.style.popwin_anim_style); this.showAtLocation(PointView, Gravity.NO_GRAVITY, location[0] + Xpixl, location[1] - this.getHeight() + Ypixl); return; case 3: //指定控件下面显示: this.setAnimationStyle(R.style.popwin_anim_style_down); this.showAtLocation(PointView, Gravity.NO_GRAVITY, location[0] + Xpixl, location[1] + PointView.getHeight() + Ypixl); return; } } //中间显示 else { this.showAtLocation(PointView, gravity, 0, 0); } }}
MainActivity.class
package com.testopensourceapplication.popwindondemo;import android.os.Build;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.WindowManager;import android.widget.LinearLayout;import android.widget.TextView;public class MainActivity extends AppCompatActivity implements View.OnClickListener{ LinearLayout ll_hud_dismiss_view; TextView fg_tv_hud_exit_navi; TextView fg_tv_hud_switch_model; TextView fg_tv_hud_nearby_addr; TextView fg_tv_hud_see_plan; TextView hm_tv_nearby_bank, hm_tv_search_parking_lot, hm_tv_search_gas_station, hm_tv_search_hotel; private CustomerPopWindow popupWindow = null;// 附近的地点 int width; int height; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //透明状态栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明导航栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } initView(); } public void initView(){
//获取屏幕的宽高 WindowManager wm = this.getWindowManager(); width = wm.getDefaultDisplay().getWidth(); height = wm.getDefaultDisplay().getHeight();
ll_hud_dismiss_view = (LinearLayout)findViewById(R.id.ll_hud_dismiss_view); fg_tv_hud_exit_navi = (TextView) findViewById(R.id.fg_tv_hud_exit_navi); fg_tv_hud_switch_model = (TextView) findViewById(R.id.fg_tv_hud_switch_model); fg_tv_hud_nearby_addr = (TextView) findViewById(R.id.fg_tv_hud_nearby_addr); fg_tv_hud_see_plan = (TextView) findViewById(R.id.fg_tv_hud_see_plan); fg_tv_hud_exit_navi.setOnClickListener(this); fg_tv_hud_switch_model.setOnClickListener(this); fg_tv_hud_nearby_addr.setOnClickListener(this); fg_tv_hud_see_plan.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.fg_tv_hud_exit_navi: break; case R.id.fg_tv_hud_switch_model: break; case R.id.fg_tv_hud_nearby_addr: showPopupWindow(); break; case R.id.fg_tv_hud_see_plan: break; default: break; } } private void showPopupWindow(){
//填冲布局 LinearLayout layout_menu = (LinearLayout) LayoutInflater.from( MainActivity.this).inflate(R.layout.hud_menu, null); hm_tv_nearby_bank = (TextView) layout_menu .findViewById(R.id.hm_tv_nearby_bank); hm_tv_search_gas_station = (TextView) layout_menu .findViewById(R.id.hm_tv_search_gas_station); hm_tv_search_parking_lot = (TextView) layout_menu .findViewById(R.id.hm_tv_search_parking_lot); hm_tv_search_hotel = (TextView) layout_menu .findViewById(R.id.hm_tv_search_hotel); hm_tv_nearby_bank.setOnClickListener(this); hm_tv_search_gas_station.setOnClickListener(this); hm_tv_search_parking_lot.setOnClickListener(this); hm_tv_search_hotel.setOnClickListener(this); popupWindow = new CustomerPopWindow(MainActivity.this, layout_menu, width / 4, height / 2, ll_hud_dismiss_view, Gravity.NO_GRAVITY, 2, width/2, 0); if (!hm_tv_nearby_bank.isFocused()) { hm_tv_nearby_bank.requestFocus(); } }}
1 0
- android自定义popupwindow动画
- Android自定义PopupWindow 动画
- Android 自定义PopupWindow动画效果
- 自定义PopupWindow动画效果
- 自定义PopupWindow动画效果
- Android-自定义popupwindow详解(包含动画简单讲解)
- android PopupWindow 动画效果
- Android之动画PopupWindow
- Android之动画PopupWindow
- Android自定义View之popupwindow进阶封装:高仿ios “item动画弹出”效果的popupwindow。
- android 自定义PopupWindow
- android自定义一个PopupWindow
- Android-自定义PopupWindow
- Android-自定义PopupWindow
- 5、Android-自定义PopupWindow
- Android 自定义PopupWindow
- Android开发自定义popupwindow
- android自定义PopupWindow组件
- Cow Contest_poj3660_floyd
- Laucher3修改
- AC算法
- 零行代码为App添加异常加载占位图
- 使用TextView/EditText应该注意的地方
- Android自定义PopupWindow 动画
- codeforce 676b Pyramid of Glasses
- 安卓开发遇到API level 问题解决方法(两种--)
- Android:控件GridView的使用
- AOP知识
- 文章标题
- 学习libSVM
- Android 启动流程
- Linux磁盘管理之df命令详解和使用实例(查看磁盘空间占用情况)