亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

自定義控件(仿PopupWindow篇)

2019-11-09 17:35:17
字體:
來源:轉載
供稿:網友

自定義控件實現方式

自定義控件實現方式原生PopupWindow實現方式自定義仿PopupWindow實現方式代碼塊結束語

本文中初步討論了關于原生PopupWindow實現方式,自定義仿PopupWindow樣式實現以及注意細節 基于Android Studio API 23開發 - 原生PopupWindow樣式實現方式 - 自定義仿PopupWindow實現方式 - 結束語


原生PopupWindow實現方式

在PopupWindow中的實現思路建樹:

前提:在一個布局中心繪制PopupWindow,設置根布局背景為半透明–》實現類似Dialog的樣式

1.彈出必須要有一個相應的樣式View

View view = LayoutInflater.from(context).inflate(R.layout.public_pop, null);

2.彈窗必須設置寬高,可選設置出現和隱藏動畫

PopupWindow window = new PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, isForce); window.setAnimationStyle(R.style.pop_style_fade);

3.彈窗的點擊事件處理

//這里必須要注意將內容里的根布局的點擊事件設為null,不然就會發生點擊內容布局pop也會消失,在測試時必須用真機的返回鍵測試//當需求為點擊PopupWindow外部消失時//要讓點擊PopupWindow之外的地方PopupWindow消失你需要調用 window.setBackgroundDrawable(new ColorDrawable(0)); window.setOutsideTouchable(false); window.setFocusable(true); contentLayout.setOnClickListener(null); //實現根布局的點擊事件,點擊外部消失 parentLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { window.dismiss(); } });//當需求為點擊PopupWindow外部不消失時,點擊返回退出程序--》應用場景:強制更新//相當于整個根布局一直獲取著焦點不會釋放 window.setFocusable(true); parentLayout.setFocusable(true); parentLayout.setFocusableInTouchMode(true); parentLayout.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK){ window.dismiss(); System.exit(0); return true; } return false; } });

4.顯示當前界面

//第一個參數是activity中的根布局 window.showAtLocation(anchorLayout, Gravity.CENTER, 0, 0);

即可顯示一個原生態的PopupWindow,設計效果如圖: 這里寫圖片描述

自定義仿PopupWindow實現方式

需求前提:使用popupwindow不能簡單實現從當前界面的哪個控件下方滑入滑出(需要計算高度并且需要單個在代碼中實現動畫效果,過程比較繁瑣并且容易出錯)

思想建樹: 1 需要當前界面的View來進行自定義動畫的開啟和關閉

2 需要實現開啟動畫和關閉動畫的對象–》ObjectAnimator

3 需要實現點擊事件(用于內部item的點擊后響應關閉pop的操作),并且暴露開啟和關閉的方法由外部調用(用于處理一些外部點擊事件)

同時需要暴露一個boolean對象用于外部判斷當前的狀態

實現前提,要求,關鍵:

前提:在當前的activity中確保這個對象的唯一性

要求:仿照dialog的設計樣式使用使用build初始化當前數據–》AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到構造器

關鍵:1. 在自定義控件中使用public static class 傳遞初始化的對象—-》上下文以及當前動畫的界面—》return new 當前的對象初始化對象中要實現的對象 2. 當前的界面需要有FrameLayout—》作用:將自定義的View對象填充進當前界面(注意:這里一定要是布局里面的frameLayout,不能是根布局,并且填充的FrameLayout需要設置大?。?/p>

代碼塊

//該類是借鑒GitHub上的自定義控件內容public class EyepetizerMenuAnimation implements View.OnClickListener { PRivate View mEyepetizerMenuView; private Context mContext; public static ObjectAnimator mMenuOpenAnimation; public static ObjectAnimator mMenuCloseAnimation; private DecelerateInterpolator mInterpolator; public static boolean mIsMenuClose = true; private static final String TRANSLATION = "translationY"; public EyepetizerMenuAnimation(EyepetizerMenuBuilder builder) { this.mContext = builder.context; this.mEyepetizerMenuView = builder.eyepetizerMenuView; this.mInterpolator = new DecelerateInterpolator(); this.mMenuOpenAnimation = buildMenuOpenAnimation(); this.mMenuCloseAnimation = buildMenuCloseAnimation(); mEyepetizerMenuView.setVisibility(View.GONE); } @Override public void onClick(View v) { if (mIsMenuClose) { open(); }else { close(); } } public static void open() { mIsMenuClose = false; AnimatorSet set = new AnimatorSet(); set.playTogether( mMenuOpenAnimation); set.start(); } public static void close() { mIsMenuClose = true; AnimatorSet set = new AnimatorSet(); set.playTogether( mMenuCloseAnimation);//mActionMenuAnimation set.start(); } private ObjectAnimator buildMenuOpenAnimation() { ObjectAnimator menuOpenAnimation = ObjectAnimator.ofFloat( mEyepetizerMenuView, TRANSLATION, -Utils.getScreenHeight(mContext), 0); menuOpenAnimation.setInterpolator(mInterpolator); menuOpenAnimation.setDuration(350); menuOpenAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); mEyepetizerMenuView.setVisibility(View.VISIBLE); } }); return menuOpenAnimation; } private ObjectAnimator buildMenuCloseAnimation() { ObjectAnimator menuCloseAnimation = ObjectAnimator.ofFloat( mEyepetizerMenuView, TRANSLATION, 0, -Utils.getScreenHeight(mContext)); menuCloseAnimation.setInterpolator(mInterpolator); menuCloseAnimation.setDuration(350); menuCloseAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mEyepetizerMenuView.setVisibility(View.GONE); } }); return menuCloseAnimation; } public static class EyepetizerMenuBuilder { private View eyepetizerMenuView; private Context context; public EyepetizerMenuBuilder(Context context, View eyepetizerMenuView) { this.eyepetizerMenuView = eyepetizerMenuView; this.context = context; } public EyepetizerMenuAnimation build() { return new EyepetizerMenuAnimation(this); } }}

在activity中添加view

//frameLayout不能為根布局,是在布局中另外用于填充的frameLayout FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Utils.getScreenHeight(getActivity()) * 3 / 5); root_fl.setLayoutParams(layoutParams); mEyepetizerMenuView = LayoutInflater.from(getActivity()).inflate(R.layout.layout_captail_pop_item, null); mEyepetizerMenuView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //截斷透明背景點擊事件 } }); root_fl.addView(mEyepetizerMenuView); new EyepetizerMenuAnimation.EyepetizerMenuBuilder( getActivity(), mEyepetizerMenuView) .build(); //添加完成后就可以關閉菜單 EyepetizerMenuAnimation.close(); //添加完成后就可以開啟菜單 EyepetizerMenuAnimation.open();

結束語

對于原生PopupWindow滿足所有基本要求,但是當滑入滑出的要求出現的時候很多新手都會被計算高度隱藏困惑并且也不能用Dialog實現,因為在界面中是PopupWindow彈出時是部分半透明。結合多方面因素考慮還是需要自定義一個為了適應界面不同,動畫相同的情況—》使用聯動的方式(即界面由外部傳入,內部獲取界面進行動畫效果(內部只控制界面開啟和關閉))。本人習慣使用Dialog代替一般需求的PopupWindow,個人感覺Dialog比較好用,自定義Dialog詳見: http://blog.csdn.net/wyh_healer/article/details/54891235


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日本中文字幕| 中文日韩在线观看| 亚洲区bt下载| 伦理中文字幕亚洲| 亚洲第一福利在线观看| 国产精品久久久久久搜索| 日韩中文字幕在线看| 粉嫩老牛aⅴ一区二区三区| 亚洲乱亚洲乱妇无码| 欧美国产精品va在线观看| 亚洲成avwww人| 国产男女猛烈无遮挡91| 91精品国产91久久久久福利| www日韩中文字幕在线看| 亚洲图片制服诱惑| 欧美激情综合亚洲一二区| 欧美视频在线视频| 久久久久久综合网天天| 欧美日韩激情美女| 国产精品视频网址| 95av在线视频| www.日本久久久久com.| 日韩在线观看av| 国产精品久久久久一区二区| 久久精品国产96久久久香蕉| 国产美女91呻吟求| www.日韩系列| 宅男66日本亚洲欧美视频| 久久精品久久久久久国产 免费| 日本精品免费观看| x99av成人免费| 国产xxx69麻豆国语对白| 日韩视频在线观看免费| 日韩成人网免费视频| 亚洲福利视频久久| 97免费视频在线| 日韩暖暖在线视频| 亚洲综合视频1区| 国产美女直播视频一区| 国产视频福利一区| 国产成人+综合亚洲+天堂| 精品国产精品自拍| 午夜精品99久久免费| 欧洲成人午夜免费大片| 国产精品自产拍高潮在线观看| 国产成人精品在线视频| 中文字幕精品久久| 国产欧美精品一区二区三区-老狼| 欧美激情在线狂野欧美精品| 92裸体在线视频网站| 亚洲美女福利视频网站| 国内精品模特av私拍在线观看| 亚洲欧美在线x视频| 欧洲日本亚洲国产区| 国产一区二区黄| 国产日韩精品入口| 亚洲97在线观看| 日韩成人在线视频观看| 久久久91精品| 亚洲午夜小视频| 亚洲精品电影在线观看| 成人中文字幕+乱码+中文字幕| 精品av在线播放| 色偷偷av一区二区三区乱| 国产美女直播视频一区| 国产精品一区二区三区免费视频| 午夜美女久久久久爽久久| 成人综合国产精品| 久久91亚洲精品中文字幕奶水| 欧美日韩午夜剧场| 两个人的视频www国产精品| 成人av在线网址| 色婷婷av一区二区三区在线观看| 久久国产精品亚洲| 91亚洲国产成人久久精品网站| 亚洲色图偷窥自拍| 91日韩在线视频| 姬川优奈aav一区二区| 亚洲成成品网站| 91精品视频在线| 国产一区二区三区日韩欧美| 欧美日韩一二三四五区| 中文字幕日韩精品在线观看| 国产不卡av在线免费观看| 91成人在线观看国产| 精品视频久久久久久久| 久久久久女教师免费一区| 国产精品爽爽爽| 国内精品模特av私拍在线观看| 亚洲三级黄色在线观看| 欧美一区二区影院| 午夜欧美不卡精品aaaaa| 欧美一区亚洲一区| 欧美激情手机在线视频| 91av中文字幕| 亚洲成成品网站| 国产精品高潮视频| 韩国v欧美v日本v亚洲| 国产精品黄页免费高清在线观看| 色哟哟亚洲精品一区二区| 国产精品视频自在线| 日韩av网址在线| 国产一区二区三区在线观看网站| 欧美高清在线观看| 亚洲激情在线视频| 国产亚洲欧美日韩一区二区| 国产精品一区二区女厕厕| 久久久久久网址| 国模精品一区二区三区色天香| 91欧美精品午夜性色福利在线| 色哟哟入口国产精品| 91爱爱小视频k| 久久久国产精品x99av| 亚洲性生活视频| 欧美大片第1页| 中文字幕亚洲第一| 日韩av在线免费看| 精品久久久久久久久久久久久久| 亚洲免费人成在线视频观看| 欧美成年人视频网站| 国产mv免费观看入口亚洲| 日本欧美在线视频| 亚洲在线观看视频| 国产91精品久久久久久久| 成人在线观看视频网站| 国产91精品久久久久久| 久久91精品国产91久久久| 亚洲欧美中文日韩v在线观看| 亚洲午夜久久久久久久| 中文字幕日本精品| 欧美日韩另类视频| 国产精品com| 欧美在线一区二区视频| 久色乳综合思思在线视频| 国产成一区二区| 丝袜美腿精品国产二区| 欧美福利小视频| 国产日本欧美在线观看| 91po在线观看91精品国产性色| 久久久久国产精品免费网站| 91av视频导航| 国产精品电影久久久久电影网| 久久久噜噜噜久久久| 色婷婷av一区二区三区在线观看| 中文字幕av一区中文字幕天堂| 国产精品99久久久久久人| 国产丝袜一区二区| 亚洲精品免费av| 久久久久久久久国产精品| 欧美激情欧美激情| 亚洲一区www| 中文字幕亚洲二区| 欧美黑人性视频| 6080yy精品一区二区三区| 日韩黄色在线免费观看| 欧美大片免费观看在线观看网站推荐| 亚洲jizzjizz日本少妇| 日韩精品在线影院| 欧美成人午夜激情| 国产视频精品久久久| 国产成人精品日本亚洲专区61| 国产精品一区=区| 韩国精品久久久999| 精品久久久久久中文字幕一区奶水|