├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── dk │ │ └── en │ │ └── floatingview │ │ ├── App.java │ │ ├── Test1Activity.java │ │ ├── Test1_1Activity.java │ │ ├── Test2Activity.java │ │ ├── Test2_1Activity.java │ │ └── TestActivity.java │ └── res │ ├── drawable │ ├── btn_round_player_bg.xml │ └── ic_launcher_background.xml │ ├── layout │ ├── float_music.xml │ └── main.xml │ ├── mipmap-xhdpi │ ├── close_white.png │ ├── ic_launcher.png │ ├── ic_launcher_round.png │ ├── player_status_pause_white.png │ └── player_status_start_white.png │ └── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── floatingview ├── .gitignore ├── build.gradle ├── gradle.properties ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── dk │ └── floatingview │ ├── DkFloatingView.java │ ├── FloatLifecycle.java │ ├── FloatWindow.java │ ├── FloatingMagnetView.java │ ├── FloatingView.java │ ├── IFloatingView.java │ └── MagnetViewListener.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── preview └── 1.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 应用内悬浮窗[![](https://jitpack.io/v/Doonkey/DkFloatingView.svg)](https://jitpack.io/#Doonkey/DkFloatingView) 2 | 3 | 应用内悬浮窗,基本无侵入性,无权限申请,简单配置,全局可用,支持滑动,点击事件 4 | 5 | > 基于开源项目修改,感谢作者;[https://github.com/leotyndale/EnFloatingView](https://github.com/leotyndale/EnFloatingView) 6 | 7 | 8 | ### 预览图 9 | 10 | ![](preview/1.png) 11 | 12 | ### 使用说明 13 | 14 | #### 导入依赖 15 | Step 1. 添加JitPack仓库到根目录build.gradle文件 16 | 17 | allprojects { 18 | repositories { 19 | ... 20 | maven { url 'https://jitpack.io' } 21 | } 22 | } 23 | Step 2. 在module添加依赖,${version}版本[![](https://jitpack.io/v/Doonkey/DkFloatingView.svg)](https://jitpack.io/#Doonkey/DkFloatingView) 24 | 25 | dependencies { 26 | implementation 'com.github.Doonkey:DkFloatingView:${version}' 27 | } 28 | 29 | #### 初始化 30 | 31 | ```Java 32 | FloatWindow.with(this)//application上下文 33 | .setLayoutId(R.layout.float_music)//悬浮布局 34 | //.setFilter(Test1_1Activity.class)//过滤activity 35 | //.setLayoutParam()//设置悬浮布局layoutParam 36 | .build(); 37 | ``` 38 | 39 | 40 | #### 点击监听 41 | 42 | ```Java 43 | FloatWindow.get()//悬浮窗实例 44 | .setOnClickListener(new DkFloatingView.ViewClickListener() { 45 | @Override 46 | public void onClick(int viewId) {//viewId 47 | switch (viewId){ 48 | ... 49 | } 50 | } 51 | }); 52 | ``` 53 | 54 | 55 | #### 显示/隐藏 56 | 57 | ```Java 58 | FloatWindow.get().show();//显示 59 | FloatWindow.get().hide();//隐藏 60 | ``` 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | defaultConfig { 6 | applicationId "com.dk.floatingview" 7 | minSdkVersion 19 8 | targetSdkVersion 26 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(dir: 'libs', include: ['*.jar']) 23 | implementation 'com.android.support:appcompat-v7:28.0.0' 24 | testImplementation 'junit:junit:4.12' 25 | androidTestImplementation 'com.android.support.test:runner:1.0.1' 26 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' 27 | implementation project(path: ':floatingview') 28 | implementation 'com.android.support.constraint:constraint-layout:2.0.4' 29 | } 30 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 11 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/dk/en/floatingview/App.java: -------------------------------------------------------------------------------- 1 | package com.dk.en.floatingview; 2 | 3 | import android.app.Application; 4 | import android.widget.Toast; 5 | 6 | import com.dk.floatingview.FloatWindow; 7 | import com.dk.floatingview.DkFloatingView; 8 | 9 | public class App extends Application { 10 | @Override 11 | public void onCreate() { 12 | super.onCreate(); 13 | FloatWindow.with(this)//application上下文 14 | .setLayoutId(R.layout.float_music)//悬浮布局 15 | //.setFilter(Test1_1Activity.class)//过滤activity 16 | //.setLayoutParam()//设置悬浮布局layoutParam 17 | .build(); 18 | FloatWindow.get().setOnClickListener(new DkFloatingView.ViewClickListener() { 19 | @Override 20 | public void onClick(int viewId) { 21 | switch (viewId){ 22 | case R.id.iv_player_status: 23 | Toast.makeText(App.this, "状态",Toast.LENGTH_SHORT).show(); 24 | break; 25 | case R.id.iv_player_close: 26 | Toast.makeText(App.this, "关闭",Toast.LENGTH_SHORT).show(); 27 | break; 28 | case R.id.iv_player_cover: 29 | Toast.makeText(App.this, "封面",Toast.LENGTH_SHORT).show(); 30 | break; 31 | } 32 | } 33 | }); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/dk/en/floatingview/Test1Activity.java: -------------------------------------------------------------------------------- 1 | package com.dk.en.floatingview; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.View; 8 | import android.widget.TextView; 9 | 10 | import com.dk.floatingview.FloatWindow; 11 | 12 | /** 13 | * @ClassName TestActivity 14 | * @Description 15 | * @Author Yunpeng Li 16 | * @Creation 2018/3/15 下午5:01 17 | * @Mender Yunpeng Li 18 | * @Modification 2018/3/15 下午5:01 19 | */ 20 | public class Test1Activity extends AppCompatActivity { 21 | 22 | @Override 23 | protected void onCreate(@Nullable Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | setContentView(R.layout.main); 26 | ((TextView) findViewById(R.id.page_num)).setText("页面Test1Activity"); 27 | } 28 | @Override 29 | protected void onResume() { 30 | super.onResume(); 31 | FloatWindow.get().hide(); 32 | } 33 | 34 | public void createActivity(View view) { 35 | Intent intent = new Intent(); 36 | intent.setClass(this, Test1_1Activity.class); 37 | startActivity(intent); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/dk/en/floatingview/Test1_1Activity.java: -------------------------------------------------------------------------------- 1 | package com.dk.en.floatingview; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.View; 8 | import android.widget.TextView; 9 | 10 | /** 11 | * @ClassName TestActivity 12 | * @Description 13 | * @Author Yunpeng Li 14 | * @Creation 2018/3/15 下午5:01 15 | * @Mender Yunpeng Li 16 | * @Modification 2018/3/15 下午5:01 17 | */ 18 | public class Test1_1Activity extends AppCompatActivity { 19 | 20 | @Override 21 | protected void onCreate(@Nullable Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.main); 24 | ((TextView) findViewById(R.id.page_num)).setText("页面Test1_1Activity"); 25 | } 26 | 27 | public void createActivity(View view) { 28 | Intent intent = new Intent(); 29 | intent.setClass(this, Test2Activity.class); 30 | startActivity(intent); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/dk/en/floatingview/Test2Activity.java: -------------------------------------------------------------------------------- 1 | package com.dk.en.floatingview; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.View; 8 | import android.widget.TextView; 9 | 10 | import com.dk.floatingview.FloatWindow; 11 | 12 | /** 13 | * @ClassName TestActivity 14 | * @Description 15 | * @Author Yunpeng Li 16 | * @Creation 2018/3/15 下午5:01 17 | * @Mender Yunpeng Li 18 | * @Modification 2018/3/15 下午5:01 19 | */ 20 | public class Test2Activity extends AppCompatActivity { 21 | 22 | @Override 23 | protected void onCreate(@Nullable Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | setContentView(R.layout.main); 26 | ((TextView) findViewById(R.id.page_num)).setText("页面Test2Activity"); 27 | } 28 | @Override 29 | protected void onResume() { 30 | super.onResume(); 31 | FloatWindow.get().show(); 32 | } 33 | 34 | public void createActivity(View view) { 35 | Intent intent = new Intent(); 36 | intent.setClass(this, Test2_1Activity.class); 37 | startActivity(intent); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/dk/en/floatingview/Test2_1Activity.java: -------------------------------------------------------------------------------- 1 | package com.dk.en.floatingview; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.View; 8 | import android.widget.TextView; 9 | 10 | /** 11 | * @ClassName TestActivity 12 | * @Description 13 | * @Author Yunpeng Li 14 | * @Creation 2018/3/15 下午5:01 15 | * @Mender Yunpeng Li 16 | * @Modification 2018/3/15 下午5:01 17 | */ 18 | public class Test2_1Activity extends AppCompatActivity { 19 | 20 | @Override 21 | protected void onCreate(@Nullable Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.main); 24 | ((TextView) findViewById(R.id.page_num)).setText("页面Test2_1Activity"); 25 | } 26 | 27 | public void createActivity(View view) { 28 | Intent intent = new Intent(); 29 | intent.setClass(this, TestActivity.class); 30 | startActivity(intent); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/dk/en/floatingview/TestActivity.java: -------------------------------------------------------------------------------- 1 | package com.dk.en.floatingview; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.View; 8 | import android.widget.TextView; 9 | 10 | import com.dk.floatingview.FloatWindow; 11 | 12 | /** 13 | * @ClassName TestActivity 14 | * @Description 15 | * @Author Yunpeng Li 16 | * @Creation 2018/3/15 下午5:01 17 | * @Mender Yunpeng Li 18 | * @Modification 2018/3/15 下午5:01 19 | */ 20 | public class TestActivity extends AppCompatActivity { 21 | 22 | @Override 23 | protected void onCreate(@Nullable Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | setContentView(R.layout.main); 26 | ((TextView) findViewById(R.id.page_num)).setText("页面TestActivity"); 27 | } 28 | 29 | @Override 30 | protected void onResume() { 31 | super.onResume(); 32 | FloatWindow.get().show(); 33 | } 34 | 35 | public void createActivity(View view) { 36 | Intent intent = new Intent(); 37 | intent.setClass(this, Test1Activity.class); 38 | startActivity(intent); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_round_player_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/float_music.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 15 | 21 | 28 | 29 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 |