热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

AndroidPopupWindow全屏详细介绍及实例代码

这篇文章主要介绍了AndroidPopupWindow全屏详细介绍及实例代码的相关资料,需要的朋友可以参考下

 Android PopupWindow全屏

很多应用中经常可以看到弹出这种PopupWindow的效果,做了一个小demo分享一下。demo的思路是通过遍历文件,找到图片以及图片文件夹放置在PopupWindow上面。点击按钮可以弹出这个PopupWindow,这里为PopupWindow设置了动画。

PopupWindow全屏代码提要

受限需要自定义Popupwindow,这里不看Popupwindow里面要展示的内容,主要是设置Popupwindow的高度。

public class PopupwindowList extends PopupWindow {
  private int mWidth;
  private int mHeight;
  private View mContentView;
  private List mFileBeans;
  private ListView mListView;

  public PopupwindowList(Context context,List mFileBeans) {
    super(context);
    this.mFileBeans=mFileBeans;
    //计算宽度和高度
    calWidthAndHeight(context);
    setWidth(mWidth);
    setHeight(mHeight);
    mCOntentView= LayoutInflater.from(context).inflate(R.layout.popupwidow,null);
    //设置布局与相关属性
    setContentView(mContentView);
    setFocusable(true);
    setTouchable(true);
    setTouchable(true);
    setTouchInterceptor(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
      //点击PopupWindow以外区域时PopupWindow消失
        if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
          dismiss();
        }
        return false;
      }
    });

  }

  /**
   * 设置PopupWindow的大小
   * @param context
   */
  private void calWidthAndHeight(Context context) {
    WindowManager wm= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics metrics= new DisplayMetrics();
    wm.getDefaultDisplay().getMetrics(metrics);

    mWidth=metrics.widthPixels;
    //设置高度为全屏高度的70%
    mHeight= (int) (metrics.heightPixels*0.7);
  }
}

点击按钮弹出PopupWindow

 mButtonShowPopup.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        //点击时弹出PopupWindow,屏幕变暗
        popupwindowList.setAnimationStyle(R.style.ListphotoSelect);
        popupwindowList.showAsDropDown(mButtonShowPopup, 0, 0);
        lightoff();

      }
    });

 private void lightoff() {
    WindowManager.LayoutParams lp=getWindow().getAttributes();
    lp.alpha=0.3f;
    getWindow().setAttributes(lp);
  }

一、FileBean类保存信息

FileBean如上图PopupWindow所示,需要保存文件的路径,文件夹的名称,文件夹中文件的数量,文件夹中第一张图片的路径。基本全部为set、get方法

/**
 * this class is used to record file information like the name of the file 、the path of the file……
 *
 */
public class FileBean {
  private String mFileName;
  private String mFilePath;
  private String mFistImgPath;
  private int mPhotoCount;

  public String getmFileName() {
    return mFileName;
  }

  public void setmFileName(String mFileName) {
    this.mFileName = mFileName;
  }

  public String getmFilePath() {
    return mFilePath;
  }

  public void setmFilePath(String mFilePath) {
    this.mFilePath = mFilePath;
    int index=this.mFilePath.lastIndexOf(File.separator);
    mFileName=this.mFilePath.substring(index);
  }

  public String getmFistImgPath() {
    return mFistImgPath;
  }

  public void setmFistImgPath(String mFistImgPath) {
    this.mFistImgPath = mFistImgPath;
  }

  public int getmPhotoCount() {
    return mPhotoCount;
  }

  public void setmPhotoCount(int mPhotoCount) {
    this.mPhotoCount = mPhotoCount;
  }
}

二、PopupWidow界面设置

自定义PopupWindow,

public class PopupwindowList extends PopupWindow {
  private int mWidth;
  private int mHeight;
  private View mContentView;
  private List mFileBeans;
  private ListView mListView;
  //观察者模式
  public interface OnSeletedListener{
    void onselected(FileBean bean);
  }
  private OnSeletedListener listener;
  public void setOnSelecterListener(OnSeletedListener listener){
    this.listener=listener;
  }
  public PopupwindowList(Context context,List mFileBeans) {
    super(context);
    this.mFileBeans=mFileBeans;
    calWidthAndHeight(context);
    setWidth(mWidth);
    setHeight(mHeight);
    mCOntentView= LayoutInflater.from(context).inflate(R.layout.popupwidow,null);
    setContentView(mContentView);
    setFocusable(true);
    setTouchable(true);
    setTouchable(true);
    setTouchInterceptor(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
      //点击PopupWindow以外区域时PopupWindow消失
        if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
          dismiss();
        }
        return false;
      }
    });
    initListView(context);
    initEvent();
  }

  private void initEvent() {

  }
  //初始化PopupWindow的listview
  private void initListView(Context context) {
    MyListViewAdapter adapter=new MyListViewAdapter(context,0,mFileBeans);
    mListView= (ListView) mContentView.findViewById(R.id.listview);
    mListView.setAdapter(adapter);
  }

  /**
   * 设置PopupWindow的大小
   * @param context
   */
  private void calWidthAndHeight(Context context) {
    WindowManager wm= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics metrics= new DisplayMetrics();
    wm.getDefaultDisplay().getMetrics(metrics);

    mWidth=metrics.widthPixels;
    mHeight= (int) (metrics.heightPixels*0.7);
  }
}

三、点击按钮弹出PopupWindow

public class PopupWindowTest extends AppCompatActivity {
  private Button mButtonShowPopup;
  private Set mFilePath;
  private List mFileBeans;
  PopupwindowList popupwindowList;
  private Handler mHandler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
      initPopupWindow();
    }
  };

  private void initPopupWindow() {
    popupwindowList=new PopupwindowList(this,mFileBeans);
    popupwindowList.setOnDismissListener(new PopupWindow.OnDismissListener() {
      @Override
      public void onDismiss() {
        lighton();
      }
    });

  }
    //PopupWindow消失时,使屏幕恢复正常
  private void lighton() {
    WindowManager.LayoutParams lp=getWindow().getAttributes();
    lp.alpha=1.0f;
    getWindow().setAttributes(lp);
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.popupwindowtestlayout);
    mButtOnShowPopup= (Button) findViewById(R.id.button_showpopup);
    mFileBeans=new ArrayList<>();
    initData();
    initEvent();

  }

  private void initEvent() {

    mButtonShowPopup.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        //点击时弹出PopupWindow,屏幕变暗
        popupwindowList.setAnimationStyle(R.style.ListphotoSelect);
        popupwindowList.showAsDropDown(mButtonShowPopup, 0, 0);
        lightoff();

      }
    });
  }

  private void lightoff() {
    WindowManager.LayoutParams lp=getWindow().getAttributes();
    lp.alpha=0.3f;
    getWindow().setAttributes(lp);
  }
  //开启线程初始化数据,遍历文件找到所有图片文件,及其文件夹与路径进行保存。
  private void initData() {
    if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
      ToastUtils.showToast(this,"当前sdcard不用使用");
    }
    new Thread(){
      @Override
      public void run() {
        super.run();
        Uri imgsUri= MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        ContentResolver cOntentResolver=getContentResolver();
        Cursor cursor=contentResolver.query(imgsUri,null,MediaStore.Images.Media.MIME_TYPE + "=&#63; or " + MediaStore.Images.Media.MIME_TYPE + "=&#63;",new String[]{"image/jpeg","image/png"},MediaStore.Images.Media.DATA);
        mFilePath=new HashSet<>();
        while (cursor.moveToNext()){
          String path=cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
          File parentfile=new File(path).getParentFile();
          if(parentfile==null) continue;
          String filePath=parentfile.getAbsolutePath();
          FileBean fileBean=null;

          if(mFilePath.contains(filePath)){
             continue;
          }else {
            mFilePath.add(filePath);
            fileBean=new FileBean();
            fileBean.setmFilePath(filePath);
            fileBean.setmFistImgPath(path);
          }
          if(parentfile.list()==null) continue;
           int count=parentfile.list(new FilenameFilter() {
             @Override
             public boolean accept(File dir, String filename) {
               if(filename.endsWith(".jpg")||filename.endsWith(".png")||filename.endsWith(".jpeg")){

                 return true;
               }
               return false;
             }
           }).length;
          fileBean.setmPhotoCount(count);
          mFileBeans.add(fileBean);

        }

        cursor.close();
        //将mFilePath置空,发送消息,初始化PopupWindow。
        mFilePath=null;
        mHandler.sendEmptyMessage(0x110);

      }
    }.start();

  }


}

四、PopupWindow动画设置。

(1)编写弹出与消失动画

①弹出动画

<&#63;xml version="1.0" encoding="utf-8"&#63;>



②消失动画

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  

(2)设置style与调用style

①设置style

在style中进行添加



  
  
  


②调用style

为PopupWindow设置动画style

  popupwindowList.setAnimationStyle(R.style.ListphotoSelect);

备注:布局很简单不再展示。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • 本文介绍了如何使用Postman构建和发送HTTP请求,包括四个主要部分:方法(Method)、URL、头部(Headers)和主体(Body)。特别强调了Body部分的重要性,并详细说明了不同类型的请求体。 ... [详细]
  • 本文主要介绍如何使用标签来优化Android应用的UI布局,通过减少不必要的视图层次,提高应用性能。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 本文介绍了如何查看PHP网站及其源码的方法,包括环境搭建、本地测试、源码查看和在线查找等步骤。 ... [详细]
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • PHP 5.5.31 和 PHP 5.6.17 安全更新发布
    PHP 5.5.31 和 PHP 5.6.17 已正式发布,主要包含多个安全修复。强烈建议所有用户尽快升级至最新版本以确保系统安全。 ... [详细]
  • 一、Tomcat安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat8.0\webapps二、Tomcat8.0配置多个端口,其实也就是给T ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 本文详细解析了ASP.NET 2.0中的Callback机制,不仅介绍了基本的使用方法,还深入探讨了其背后的实现原理。通过对比Atlas框架,帮助读者更好地理解和应用这一机制。 ... [详细]
  • 本文详细介绍了如何在PHP中记录和管理行为日志,包括ThinkPHP框架中的日志记录方法、日志的用途、实现原理以及相关配置。 ... [详细]
  • Spring 中 Bean 信息定义的三种方法探讨
    本文详细探讨了 Spring 框架中实现 Bean 信息定义的三种方法:基于 XML 配置、基于注解配置和基于 Java 类配置。每种方法都有其适用场景和优缺点。 ... [详细]
author-avatar
姜漂亮真可爱w0
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有