Skip to content

Commit

Permalink
修正悬浮窗生命周期管理逻辑
Browse files Browse the repository at this point in the history
新增支持不同方向拖拽回弹效果
  • Loading branch information
getActivity committed Dec 5, 2020
1 parent 183de48 commit e2df8bc
Show file tree
Hide file tree
Showing 12 changed files with 143 additions and 46 deletions.
18 changes: 8 additions & 10 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/.gradle
/.idea
/build
*/build
/captures
/.idea
/.cxx
/.externalNativeBuild

/app/*.pro

/library/*.pro
*.iml
.DS_Store
local.properties
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# 悬浮窗框架

> 码云地址:[Gitee](https://gitee.com/getActivity/XToast)
* 码云地址:[Gitee](https://gitee.com/getActivity/XToast)

> 博客地址:[悬浮窗需求终结者](https://www.jianshu.com/p/247d705b87b6)
* 博客地址:[悬浮窗需求终结者](https://www.jianshu.com/p/247d705b87b6)

> 已投入公司项目多时,没有任何毛病,可胜任任何需求,[点击此处下载Demo](XToast.apk)
* 已投入公司项目多时,没有任何毛病,可胜任任何需求,[点击此处下载Demo](XToast.apk)

![](XToast.gif)

Expand All @@ -15,7 +15,7 @@
```groovy
dependencies {
// 悬浮窗框架:https://github.com/getActivity/XToast
implementation 'com.hjq:xtoast:6.2'
implementation 'com.hjq:xtoast:6.5'
}
```

Expand Down Expand Up @@ -80,6 +80,8 @@ new XToast(XToastActivity.this)

* 国际化框架:[MultiLanguages](https://github.com/getActivity/MultiLanguages)

* Gson 解析容错:[GsonFactory](https://github.com/getActivity/GsonFactory)

#### Android技术讨论Q群:78797078

#### 如果您觉得我的开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 :monkey_face:就太:thumbsup:了。您的支持将鼓励我继续创作:octocat:
Expand Down
Binary file modified XToast.apk
Binary file not shown.
1 change: 0 additions & 1 deletion app/.gitignore

This file was deleted.

6 changes: 3 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ android {
applicationId "com.hjq.xtoast.demo"
minSdkVersion 16
targetSdkVersion 28
versionCode 62
versionName "6.2"
versionCode 65
versionName "6.5"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
Expand All @@ -28,7 +28,7 @@ dependencies {
implementation 'com.android.support:design:28.0.0'

// 权限请求框架:https://github.com/getActivity/XXPermissions
implementation 'com.hjq:xxpermissions:9.0'
implementation 'com.hjq:xxpermissions:9.5'
// 标题栏框架:https://github.com/getActivity/TitleBar
implementation 'com.hjq:titlebar:8.2'
// 吐司工具类:https://github.com/getActivity/ToastUtils
Expand Down
1 change: 1 addition & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
-keep class com.hjq.xtoast.** {*;}
13 changes: 6 additions & 7 deletions app/src/main/java/com/hjq/xtoast/demo/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import android.widget.ImageView;
import android.widget.TextView;

import com.hjq.permissions.OnPermission;
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import com.hjq.toast.ToastUtils;
Expand Down Expand Up @@ -125,16 +125,15 @@ public void onClick(XToast toast, TextView view) {
public void show6(View v) {
XXPermissions.with(this)
.permission(Permission.SYSTEM_ALERT_WINDOW)
.request(new OnPermission() {
.request(new OnPermissionCallback() {

@Override
public void hasPermission(List<String> granted, boolean all) {
public void onGranted(List<String> granted, boolean all) {
// 传入 Application 表示这个是一个全局的 Toast
new XToast(getApplication())
.setView(R.layout.toast_phone)
.setGravity(Gravity.END | Gravity.BOTTOM)
.setXOffset(100)
.setYOffset(100)
.setYOffset(200)
// 设置指定的拖拽规则
.setDraggable(new SpringDraggable())
.setOnClickListener(android.R.id.icon, new OnClickListener<ImageView>() {
Expand All @@ -154,7 +153,7 @@ public void onClick(XToast toast, ImageView view) {
}

@Override
public void noPermission(List<String> denied, boolean never) {
public void onDenied(List<String> denied, boolean never) {
new XToast(MainActivity.this)
.setDuration(1000)
.setView(R.layout.toast_hint)
Expand All @@ -169,7 +168,7 @@ public void show7(View v) {
// 将 ToastUtils 中的 View 转移给 XToast 来显示
new XToast(this)
.setDuration(1000)
.setView(ToastUtils.getToast().getView())
.setView(ToastUtils.getView())
.setAnimStyle(android.R.style.Animation_Translucent)
.setText(android.R.id.message, "就问你溜不溜")
.setGravity(Gravity.BOTTOM)
Expand Down
1 change: 0 additions & 1 deletion library/.gitignore

This file was deleted.

6 changes: 3 additions & 3 deletions library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,16 @@ android {

defaultConfig {
minSdkVersion 14
versionCode 62
versionName "6.2"
versionCode 65
versionName "6.5"
}
}

publish {
userOrg = 'getactivity'
groupId = 'com.hjq'
artifactId = 'xtoast'
version = '6.2'
version = '6.5'
description = 'This is a simple and easy to use suspension window frame'
website = "https://github.com/getActivity/XToast"
}
Expand Down
25 changes: 25 additions & 0 deletions library/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\SDK\Studio\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
6 changes: 5 additions & 1 deletion library/src/main/java/com/hjq/xtoast/ToastLifecycle.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public void onActivityResumed(Activity activity) {}

@Override
public void onActivityPaused(Activity activity) {
// 一定要在 onPaused 方法中销毁掉,如果在 onDestroyed 方法中还是会导致内存泄露
// 一定要在 onPaused 方法中销毁掉,如果放在 onDestroyed 方法中还是有一定几率会导致内存泄露
if (mActivity != null && mToast != null && mActivity == activity && mToast.isShow() && mActivity.isFinishing()) {
mToast.cancel();
}
Expand All @@ -73,8 +73,12 @@ public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
@Override
public void onActivityDestroyed(Activity activity) {
if (mActivity == activity) {
// 释放 Activity 的引用
mActivity = null;
if (mToast != null) {
if (mToast.isShow()) {
mToast.cancel();
}
mToast.recycle();
mToast = null;
}
Expand Down
102 changes: 86 additions & 16 deletions library/src/main/java/com/hjq/xtoast/draggable/SpringDraggable.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;

/**
* author : Android 轮子哥
Expand All @@ -19,6 +20,24 @@ public class SpringDraggable extends BaseDraggable {
private float mViewDownX;
private float mViewDownY;

/** 回弹的方向 */
private int mOrientation;

public SpringDraggable() {
this(LinearLayout.HORIZONTAL);
}

public SpringDraggable(int orientation) {
mOrientation = orientation;
switch (mOrientation) {
case LinearLayout.HORIZONTAL:
case LinearLayout.VERTICAL:
break;
default:
throw new IllegalArgumentException("You cannot pass in directions other than horizontal or vertical");
}
}

@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
Expand All @@ -42,19 +61,40 @@ public boolean onTouch(View v, MotionEvent event) {
// 记录移动的位置(相对屏幕的坐标)
rawMoveX = event.getRawX();
rawMoveY = event.getRawY() - getStatusBarHeight();
// 获取当前屏幕的宽度
int screenWidth = getScreenWidth();

// 自动回弹吸附
final float rawFinalX;
if (rawMoveX < screenWidth / 2f) {
// 回弹到屏幕左边
rawFinalX = 0f;
} else {
// 回弹到屏幕右边
rawFinalX = screenWidth;
switch (mOrientation) {
case LinearLayout.HORIZONTAL:
final float rawFinalX;
// 获取当前屏幕的宽度
int screenWidth = getScreenWidth();
if (rawMoveX < screenWidth / 2f) {
// 回弹到屏幕左边
rawFinalX = 0f;
} else {
// 回弹到屏幕右边
rawFinalX = screenWidth;
}
// 从移动的点回弹到边界上
startHorizontalAnimation(rawMoveX - mViewDownX, rawFinalX - mViewDownX, rawMoveY - mViewDownY);
break;
case LinearLayout.VERTICAL:
final float rawFinalY;
// 获取当前屏幕的高度
int screenHeight = getScreenHeight();
if (rawMoveY < screenHeight / 2f) {
// 回弹到屏幕顶部
rawFinalY = 0f;
} else {
// 回弹到屏幕底部
rawFinalY = screenHeight;
}
// 从移动的点回弹到边界上
startVerticalAnimation(rawMoveX - mViewDownX, rawMoveY - mViewDownY, rawFinalY);
break;
default:
break;
}
// 从移动的点回弹到边界上
startAnimation(rawMoveX - mViewDownX, rawFinalX - mViewDownX, rawMoveY - mViewDownY);
// 如果用户移动了手指,那么就拦截本次触摸事件,从而不让点击事件生效
return isTouchMove(mViewDownX, event.getX(), mViewDownY, event.getY());
default:
Expand All @@ -74,13 +114,23 @@ private int getScreenWidth() {
}

/**
* 执行动画
* 获取屏幕的高度
*/
private int getScreenHeight() {
WindowManager manager = getWindowManager();
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
return outMetrics.heightPixels;
}

/**
* 执行水平回弹动画
*
* @param startX X轴起点坐标
* @param endX X轴终点坐标
* @param y Y轴坐标
* @param startX X 轴起点坐标
* @param endX X 轴终点坐标
* @param y Y 轴坐标
*/
private void startAnimation(float startX, float endX, final float y) {
private void startHorizontalAnimation(float startX, float endX, final float y) {
ValueAnimator animator = ValueAnimator.ofFloat(startX, endX);
animator.setDuration(500);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
Expand All @@ -92,4 +142,24 @@ public void onAnimationUpdate(ValueAnimator animation) {
});
animator.start();
}

/**
* 执行垂直回弹动画
*
* @param x X 轴坐标
* @param startY Y 轴起点坐标
* @param endY Y 轴终点坐标
*/
private void startVerticalAnimation(final float x, float startY, final float endY) {
ValueAnimator animator = ValueAnimator.ofFloat(startY, endY);
animator.setDuration(500);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override
public void onAnimationUpdate(ValueAnimator animation) {
updateLocation(x, (float) animation.getAnimatedValue());
}
});
animator.start();
}
}

0 comments on commit e2df8bc

Please sign in to comment.