android popupwindow代码,Android PopupWindow全屏详细介绍及实例代码

Android PopupWindow全屏

dfa267adcb1d6c31e431a56b0ab2335d.gif

很多应用中经常可以看到弹出这种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 + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?",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)编写弹出与消失动画

①弹出动画

android:toXDelta="0"

android:fromYDelta="100%"

android:toYDelta="0"

android:duration="1000">

②消失动画

android:toXDelta="0"

android:fromYDelta="0"

android:toYDelta="100%"

android:duration="1000">

(2)设置style与调用style

①设置style

在style中进行添加

@anim/animshow

@anim/animdismiss

②调用style

为PopupWindow设置动画style

popupwindowList.setAnimationStyle(R.style.ListphotoSelect);

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值