Android?PopUpWindow實現(xiàn)卡片式彈窗

首先自定義一個ViewGroup,繼承自LinerLayout,為了實現(xiàn)上下滑動
//用于實現(xiàn)頂部彈窗動畫 以及向上滑動動畫
public class TopTipsLinearLayout extends LinearLayout {
private static final String TAG = "Hyh";
private int mHeight;
private boolean mIsFirstLayout=true;
private boolean mIsPalyingAnimation=false;
private int mLastY=0;
private int mLastX=0;
private final int mTouchSlop = 4;
private final long SINGLE_CLICK_TIME = 300;
private long beginTiem=0;
private boolean mIsMoving=false;
public TopTipsLinearLayout(Context context) {
super(context);
}
public TopTipsLinearLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public TopTipsLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public TopTipsLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if(mIsFirstLayout) {
mHeight = getHeight();
mIsFirstLayout = false;
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mIsMoving = false;
beginTiem = System.currentTimeMillis();
break;
case MotionEvent.ACTION_MOVE:
int deltay = (int)event.getRawY() - mLastY;
if(!mIsPalyingAnimation) {
if(deltay < 0 || getTranslationY() + deltay <= 0) {
setTranslationY(getTranslationY() + deltay);
}
}
if(isMove(event.getRawX(), event.getRawY())) {
mIsMoving = true;
}
break;
case MotionEvent.ACTION_UP:
if(System.currentTimeMillis() - beginTiem <= SINGLE_CLICK_TIME && !mIsMoving) {
performClick();
}
mIsMoving = false;
if(Math.abs(getTranslationY()) <= (float) mHeight/3) {
setTranslationY(0);
} else {
fadeOutAnimator(200);
}
break;
}
mLastY = (int)event.getRawY();
mLastX = (int)event.getRawX();
return true;
}
private boolean isMove(float curX,float curY) {
return Math.abs(curX - mLastX) >= mTouchSlop || Math.abs(curY - mLastY) >= mTouchSlop;
}
public void showEnterAnimator(long time) {
setVisibility(VISIBLE);
//向下移動動畫
TranslateAnimation downTranslateAnimation=new TranslateAnimation(0,0,-mHeight, 0);
downTranslateAnimation.setDuration(time);
downTranslateAnimation.setFillAfter(true);
mIsPalyingAnimation = true;
startAnimation(downTranslateAnimation);
downTranslateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
mIsPalyingAnimation = false;
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
public void fadeOutAnimator(long time) {
if(mIsMoving) {
postDelayed(new Runnable() {
@Override
public void run() {
fadeOutAnimator(300);
}
}, 1500);
return ;
}
//向上移動動畫
TranslateAnimation downTranslateAnimation=new TranslateAnimation(0,0,0, -mHeight - getTranslationY());
downTranslateAnimation.setDuration(time);
downTranslateAnimation.setFillAfter(true);
mIsPalyingAnimation = true;
startAnimation(downTranslateAnimation);
//動畫監(jiān)聽
downTranslateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation){
setVisibility(GONE); //動畫結(jié)束 消除視圖
mIsPalyingAnimation = false;
}
@Override
public void onAnimationRepeat(Animation animation) {}
});
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
}
}
定義一個layout文件
<?xml version="1.0" encoding="utf-8"?>
<com.example.randfood.customview.TopTipsLinearLayout
android:id="@+id/top_tips_root"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:visibility="invisible">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="這是一個消息彈窗"
android:layout_gravity="center_horizontal"
android:textSize="30sp"
android:padding="20dp"
android:background="@drawable/messageview_top_pop_bg"/>
</com.example.randfood.customview.TopTipsLinearLayout>
調(diào)用下面的方法即可
private static void initPopUpWindow(Context context, View parentView) {
View view = View.inflate(context, R.layout.messageview_top_pop, null);
PopupWindow popupWindow = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, false);
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
popupWindow.setOutsideTouchable(false);
//讓popupwindow可以顯示在狀態(tài)欄中
popupWindow.setClippingEnabled(false);
// popupWindow.setTouchable(true);
popupWindow.showAtLocation(parentView, Gravity.TOP, 0, 0);
TopTipsLinearLayout layout = view.findViewById(R.id.top_tips_root);
//讓viewgroup中的內(nèi)容顯示在狀態(tài)欄下面
layout.setPadding(0, DisplayUtil.getStatusBarHeight(context), 0, 0);
layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "你點(diǎn)擊了頂部消息", Toast.LENGTH_SHORT).show();
}
});
layout.post(new Runnable() {
@Override
public void run() {
layout.showEnterAnimator(300);
}
});
layout.postDelayed(new Runnable() {
@Override
public void run() {
layout.fadeOutAnimator(300);
}
}, 5000);
}
到此這篇關(guān)于Android PopUpWindow實現(xiàn)卡片式彈窗的文章就介紹到這了,更多相關(guān)Android PopUpWindow彈窗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android開發(fā)自定義控件之折線圖實現(xiàn)方法詳解
這篇文章主要介紹了Android開發(fā)自定義控件之折線圖實現(xiàn)方法,結(jié)合實例形式詳細(xì)分析了Android自定義控件中折線圖原理、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下2020-05-05
Android應(yīng)用開發(fā)的版本更新檢測升級功能實現(xiàn)示例
本文對Android版本更新的知識做全面的總結(jié),主要包括開發(fā)中版本的設(shè)置,如何檢測本程序的版本,版本的更新判斷和顯示,新版本程序的安裝2022-04-04
android教程之使用popupwindow創(chuàng)建菜單示例
這篇文章主要介紹了android使用popupwindow創(chuàng)建菜單的示例,需要的朋友可以參考下2014-02-02
android組件SwipeRefreshLayout下拉小球式刷新效果
這篇文章主要為大家詳細(xì)介紹了android組件SwipeRefreshLayout下拉小球式刷新效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
Android Studio 4.0 正式發(fā)布在Ubuntu 20.04中安裝的方法
這篇文章主要介紹了Android Studio 4.0 正式發(fā)布如何在Ubuntu 20.04中安裝,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06

