日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

PopupWindow 使用详解(二) Popwindow 制作常见花哨效果

發布時間:2023/12/10 windows 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PopupWindow 使用详解(二) Popwindow 制作常见花哨效果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

帝都幾日降溫,終于被撂倒了。but 只要一息尚存就得不斷進步!于是,寫出 《PopupWindow 使用詳解》的第二篇 筆記,先奉上 第一篇鏈接: 《PopupWindow 使用詳解(一) 中文API 文檔 贈送 ListPopupWindow 中文 API》 。下面給大家展示一下制作的效果gif。

下面進行一個樣式一個樣式的肢解哈,對了,所有效果筆者都沒有制作載入動畫和退出動畫。有需要的小伙伴可以通過 這個方法 public void setAnimationStyle(int animationStyle) 進行設置,也是很簡單、很常用的。

效果一、圖片選取功能(帶陰影)

1、布局設置

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/ll_pic"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/shape_pic_select"android:gravity="bottom"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginStart="5dp"android:layout_marginEnd="5dp"android:orientation="vertical"><Buttonandroid:id="@+id/btn_pic_photo"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="1dp"android:background="#ffffff"android:text="相 冊"android:textColor="#3c3c3c"android:textSize="16sp" /><Buttonandroid:id="@+id/btn_pic_camera"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="1dp"android:background="#ffffff"android:text="拍 照"android:textColor="#3c3c3c"android:textSize="16sp" /><Buttonandroid:id="@+id/btn_pic_cancel"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="1dp"android:background="#ffffff"android:text="取 消"android:textColor="#3c3c3c"android:textSize="16sp" /></LinearLayout> </LinearLayout>

2、Java 邏輯代碼

/*** 照片選擇器*/@SuppressLint("InflateParams")private void showPicSelect() {view = LayoutInflater.from(this).inflate(R.layout.item_pic_select, null, false);LinearLayout llPop = view.findViewById(R.id.ll_pic);Button btnCamera = view.findViewById(R.id.btn_pic_camera);Button btnPhoto = view.findViewById(R.id.btn_pic_photo);Button btnCancel = view.findViewById(R.id.btn_pic_cancel);btnCamera.setOnClickListener(this);btnPhoto.setOnClickListener(this);btnCancel.setOnClickListener(this);llPop.setOnClickListener(this);myPop = new PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);myPop.setBackgroundDrawable(new ColorDrawable());myPop.showAtLocation(rlMain, Gravity.BOTTOM, 0, 0);}@Overridepublic void onBackPressed() {if (myPop.isShowing()) {myPop.dismiss();} else {super.onBackPressed();}}

3、實現思路

之前筆者看了看網上百度來的答案,實現陰影效果的思路大概是,當 PopupWindow 彈出時將 Activity 設置為半透明,但是這種思路的弊端是 Activity 透明了,你懂得,你可以在 A Activity 界面直接看到了 桌面或者是 B Activity 界面的東西,很蛋疼。
筆者的思路是:為 PopupWindow 設置一個半透明的背景色,然后監聽這不背景 layout 的點擊事件,和物理鍵的返回事件。否則會出現點擊無效果的現象。具體邏輯如上。

二、仿qq和微信的長按置頂刪除功能

1、布局

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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"><LinearLayoutandroid:id="@+id/ll_qq"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:background="@drawable/shape_qq"android:orientation="horizontal"tools:ignore="UselessParent"><TextViewandroid:id="@+id/tv_delete"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:text="刪除"android:textColor="#ffffff"android:textSize="16sp" /><Viewandroid:layout_width="2dp"android:layout_height="match_parent"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:background="#666666" /><TextViewandroid:id="@+id/tv_be_top"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:text="置頂"android:textColor="#ffffff"android:textSize="16sp" /></LinearLayout><ImageViewandroid:id="@+id/iv_three"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/ll_qq"android:layout_centerHorizontal="true"android:background="@null"android:layout_marginTop="-5dp"android:contentDescription="@string/app_name"android:src="@mipmap/ic_three" /> </RelativeLayout>

2、Java 邏輯

/*** 仿qq 產生水滴按鈕*/@SuppressLint("InflateParams")private void showQq() {view = LayoutInflater.from(this).inflate(R.layout.item_qq, null, false);TextView tvTop = view.findViewById(R.id.tv_be_top);TextView tvDelete = view.findViewById(R.id.tv_delete);tvDelete.setOnClickListener(this);tvTop.setOnClickListener(this);myPop = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);myPop.setBackgroundDrawable(new ColorDrawable());myPop.setOutsideTouchable(true);myPop.getContentView().measure(0, 0);myPop.showAsDropDown(cvMain, (cvMain.getWidth() - myPop.getContentView().getMeasuredWidth()) / 2,-(cvMain.getHeight() + myPop.getContentView().getMeasuredHeight()));}

3、實現思路

這個其實沒什么好說的,但是需要注意的兩點是:(1)、ui 一定要有的或者是自己會個ps 也行,仔細看筆者布局,有一個地方,設置 margin 屬性居然用了 負值 否則無法保證 下面的shape 背景與三角標進行無縫銜接;(2)、注意這個方法一定要設置即便是不設置值 public void setBackgroundDrawable(Drawable background) 否則會導致 public void setOutsideTouchable(boolean touchable) 這個方法不起作用,即出現點擊 PopupWindow 外部區域無法隱藏 PopupWindow 的尷尬局面

三、實現懸浮圖片輪播

1、布局代碼

<!--布局 1--> <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#00000000"app:cardCornerRadius="10dp"><android.support.v4.view.ViewPagerandroid:id="@+id/vp_pop"android:layout_width="200dp"android:layout_height="300dp"android:background="#48BAFF" /></android.support.v7.widget.CardView><!--布局 2--> <?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:gravity="center"android:orientation="vertical"><ImageViewandroid:layout_width="200dp"android:layout_height="300dp"android:contentDescription="@string/app_name"android:src="@mipmap/pic_1" /> </LinearLayout>

2、Java 邏輯代碼

/*** 輪播效果*/@SuppressLint("InflateParams")private void showPager() {views = new ArrayList<>();view = LayoutInflater.from(this).inflate(R.layout.item_pager, null, false);ViewPager vpPop = view.findViewById(R.id.vp_pop);picView01 = LayoutInflater.from(this).inflate(R.layout.item_pop_vp_01, null, false);picView02 = LayoutInflater.from(this).inflate(R.layout.item_pop_vp_02, null, false);picView03 = LayoutInflater.from(this).inflate(R.layout.item_pop_vp_03, null, false);picView04 = LayoutInflater.from(this).inflate(R.layout.item_pop_vp_04, null, false);views.add(picView01);views.add(picView02);views.add(picView03);views.add(picView04);vpPop.setAdapter(new MyPopAdapter());myPop = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);myPop.setOutsideTouchable(true);//懸浮效果myPop.setElevation(5);myPop.setBackgroundDrawable(new ColorDrawable(0x00ffffff));myPop.showAtLocation(rlMain, Gravity.CENTER, 0, 0);}/*** 配置 adapter*/class MyPopAdapter extends PagerAdapter {@Overridepublic int getCount() {return views.size();}@Overridepublic boolean isViewFromObject(@NonNull View view, @NonNull Object o) {return view == o;}@NonNull@Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {container.addView(views.get(position));return views.get(position);}@Overridepublic void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {container.removeView(views.get(position));}}@Overrideprotected void onDestroy() {super.onDestroy();if (views != null) {views.remove(picView01);views.remove(picView02);views.remove(picView03);views.remove(picView04);}if (myPop.isShowing()) {myPop.dismiss();}}

3、實現思路及注意事項

首先,加載圖片需要進行相關處理,比如說用過Picasso 或者是 Glide 等框架,當然了也可將進行自己壓縮;

其次,由于為了突出美觀,筆者用了一個 CardView 可以設置圓角,但是 CardView 的陰影屬性失效了,為了凸顯層次感可以設置 PopupWindow 的這個方法 public void setElevation(float elevation) 該方法可以是你感覺出一種懸浮的效果;

最后,沒用的 view 需要進行清理,否則會留在內存哦。

四、向下彈出水滴效果

1、布局源碼

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBottom="@+id/iv_beauty"android:layout_toEndOf="@+id/iv_beauty"android:src="@mipmap/ic_right" /><ImageViewandroid:id="@+id/iv_beauty"android:layout_width="150dp"android:layout_height="200dp"android:background="#669"android:src="@mipmap/pic_5" /> </RelativeLayout>

2、Java 邏輯

/*** 向下彈出*/@SuppressLint("InflateParams")private void showDown() {view = LayoutInflater.from(this).inflate(R.layout.item_anywhere, null, false);myPop = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);myPop.setBackgroundDrawable(new ColorDrawable());myPop.setOutsideTouchable(true);myPop.getContentView().measure(0, 0);myPop.showAsDropDown(btnPopDown, -((myPop.getContentView().getMeasuredWidth() - btnPopDown.getWidth()) / 2), 0);}

3、注意事項

這個沒什么可說的了,和 上面 小標題二 相同 ,具體查看上方即可。

五、實現屏幕右側向左彈出

1、布局代碼

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBottom="@+id/iv_beauty"android:layout_toEndOf="@+id/iv_beauty"android:src="@mipmap/ic_right" /><ImageViewandroid:id="@+id/iv_beauty"android:layout_width="150dp"android:layout_height="200dp"android:background="#669"android:src="@mipmap/pic_5" /> </RelativeLayout>

2、Java 邏輯代碼

/*** 向左彈出*/@SuppressLint("InflateParams")private void showStart() {view = LayoutInflater.from(this).inflate(R.layout.item_pop_start, null, false);myPop = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);myPop.setBackgroundDrawable(new ColorDrawable());myPop.setOutsideTouchable(true);myPop.getContentView().measure(0, 0);myPop.showAsDropDown(fabStart, -(myPop.getContentView().getMeasuredWidth()), -(fabStart.getHeight() / 2 + myPop.getContentView().getMeasuredHeight()));}

3、注意事項

這里比較復雜的 就是 PopupWindow 的錨點位置 為 其寄生的 控件的 左下角,而 Popwindow 的起始點為 左上角,但是 PopupWindow 默認不超出界面。這就導致了 PopupWindow 明明在 控件則左側,但是卻無法到達自己的想要位置。
所以 對于該現象,我們只能 在計算偏移量的時候 需要向左 移動 (控件長度+PopupWindow的長度 +其他長度)

六、實現需要獲取焦點的控件使用

1、布局代碼

<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#00000000"app:cardCornerRadius="10dp"><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#00000000"android:padding="10dp"><TextViewandroid:id="@+id/tv_name_p"android:layout_width="wrap_content"android:layout_height="40dp"android:gravity="center_vertical"android:text="賬戶:"android:textSize="16sp" /><EditTextandroid:layout_width="200dp"android:layout_height="40dp"android:layout_toEndOf="@+id/tv_name_p"android:background="@null"android:gravity="center_vertical"android:inputType="number"android:paddingStart="10dp"android:paddingEnd="10dp"android:singleLine="true"android:textSize="16sp"tools:text="123" /><TextViewandroid:id="@+id/tv_password_p"android:layout_width="wrap_content"android:layout_height="40dp"android:layout_below="@+id/tv_name_p"android:gravity="center_vertical"android:text="密碼:"android:textSize="16sp" /><EditTextandroid:layout_width="200dp"android:layout_height="40dp"android:layout_below="@+id/tv_name_p"android:layout_toEndOf="@+id/tv_password_p"android:background="@null"android:gravity="center_vertical"android:inputType="numberPassword"android:paddingStart="10dp"android:paddingEnd="10dp"android:singleLine="true"android:textSize="16sp"tools:text="123" /></RelativeLayout> </android.support.v7.widget.CardView>

2、邏輯代碼

/*** 向右彈出 輸入框*/@SuppressLint("InflateParams")private void showEnd() {view = LayoutInflater.from(this).inflate(R.layout.item_end_input, null, false);myPop = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);myPop.setBackgroundDrawable(new ColorDrawable(0x00ffffff));myPop.setElevation(10);myPop.setOutsideTouchable(true);myPop.setFocusable(true);myPop.getContentView().measure(0, 0);myPop.showAsDropDown(fadEnd, (int) (fadEnd.getWidth() * 1.3), -((fadEnd.getHeight() + myPop.getContentView().getMeasuredHeight()) / 2));}

3、注意事項

這里一定要 設置該方法 public void setFocusable(boolean focusable) 否則 在切換EditText 的時候只是光標進行了移動,但是 無法召喚軟鍵盤。

七、總結

1、筆者認為,上面的大概可以滿足比較簡單的開發需求了,筆者很菜,這些已經足可以滿足筆者了目前;
2、關于偏移量這個會涉及導到一些小小的計算和一點點邏輯想法,所以不要只是做 cv 戰士,作為文雅的程序員,我們還是需要有點自己的想法的哈;
3、代碼上傳 github 地址為:PopupWindow
4、希望可以幫到你,批評和建議,望各位大佬留言,小生在這里謝過了。

總結

以上是生活随笔為你收集整理的PopupWindow 使用详解(二) Popwindow 制作常见花哨效果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91精品国产91久久久久青草 | 男女午夜啪啪 | 男男车车的车车网站w98免费 | 男女啪啪毛片 | 综合网伊人 | 国产xxx69麻豆国语对白 | 日韩黄色免费观看 | 午夜免费福利在线观看 | 中文字幕第66页 | 激情影院内射美女 | 成年人在线观看视频免费 | 午夜精品久久久久久久99热浪潮 | 久草国产精品 | 尤物精品视频 | 九九九九九伊人 | 日本午夜激情 | 一区二区三区免费在线观看 | 亚洲精品乱码久久久久久蜜桃动漫 | 日韩一区二区三区视频在线 | 成人毛片在线精品国产 | 欧美巨乳在线观看 | 色综合图区 | 国产精品系列在线观看 | 亚洲精品自拍视频 | 黄色网免费 | 99热在线观看免费精品 | 99热这| 久久午夜电影网 | 亚洲在线电影 | 欧美午夜精品久久久久久人妖 | 性一交一乱一乱一视频 | 日本a v网站 | 美女视频三区 | 99精品视频免费在线观看 | 色乱码一区二区三区在线男奴 | 91色片 | 久久少妇视频 | 91麻豆精品秘密入口 | 亚洲一二三四区 | 国产重口老太伦 | 在线观看免费日韩av | 韩国日本中文字幕 | 国产aa视频| 精品国产乱码久久久久久影片 | 人妻一区二区视频 | 亚洲欧美中文字幕 | 国产精品久久国产精品 | 成人性做爰aaa片免费看不忠 | 狼人综合视频 | 午夜生活片 | 成年人在线视频 | 极品福利视频 | 亚洲黄色免费在线观看 | 国产一二三在线视频 | 丁香婷婷成人 | 国产美女性生活 | 强睡邻居人妻中文字幕 | 黄网站免费在线 | 中文字幕理论片 | 国产吞精囗交免费视频 | 伊人射| 91成年版 | 成人污污www网站免费丝瓜 | 啪啪网站视频 | 国产精品手机在线 | 国产人人干 | 亚欧毛片 | 黄视频免费在线观看 | 床戏高潮做进去大尺度视频 | 亚洲视频在线观看视频 | 狠狠爱天天干 | 欧美精品在线第一页 | 欧美77777 | 亚洲天堂免费观看 | 日韩视频一区二区 | 色姐| 成年人免费网站 | 国产xxx | 蜜臀av无码精品人妻色欲 | 污漫在线观看 | 国产白丝袜美女久久久久 | 一级黄色录相 | 91免费看. | 亚洲成年网站 | 久久精品国产精品亚洲毛片 | 亚洲欧美日韩综合在线 | 日本jizzjizz| 草民午夜理伦三级 | 欧美黑吊大战白妞欧美大片 | 日韩欧美精品一区二区三区 | 8x8ⅹ国产精品一区二区二区 | 天天干天天色天天射 | 中文字幕二 | 亚洲女人天堂色在线7777 | 国产麻豆成人 | 日韩精品免费一区二区夜夜嗨 | 日产精品久久久久 | 日本在线一 | 成人做爰69片免费 |