package com.example.zxk.mywindowdemo;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
/**
* Created by ZXK on 2017/10/30.
*/
public class WindowController {
private final int HIDE = 0x001;
private final int SHOW = 0x002;
private final int REFRESH = 0x003;
private final int CLICK = 0x004;
private static WindowController instance;
private Context context;
private WindowManager mWindowManager;
private WindowManager.LayoutParams wParamsTop, wParamsBottom;
//最小滑动距离
private int mTouchSlop;
//上下两个布局
private LinearLayout layoutTop, layoutBottom;
private TextView top;
private ViewPager viewPager;
//viewPager的adapter
private WindowAdapter windowAdapter;
//viewPager每一页的Adapter
private ViewAdapter viewAdapter;
private RadioGroup radioGroup;
//存放数据
private List<String> mDatas;
//存放每一页的数据
private List<String> pageData;
//存放视图
private List<View> viewList;
private int lastX, lastY;
private int downX, downY;
//down 时的时间戳
private int downTime;
//屏幕宽高
private int screenWidth, screenHeight;
//top xy坐标, bottom y坐标
private int topY, bottomY, topX;
//top 的宽高
private int topWidth, topHeight;
//bottom 的高
private int bottomHeight;
//状态栏的高度
private int statusBarHeight;
//展开 or 收起
private boolean isShow;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case HIDE:
hideBottom();
break;
case SHOW:
showBottom();
break;
case REFRESH:
mWindowManager.updateViewLayout(layoutTop, wParamsTop);
if (isShow) {
mWindowManager.updateViewLayout(layoutBottom, wParamsBottom);
}
break;
case CLICK:
click();
break;
default:
super.handleMessage(msg);
}
}
};
private WindowController(Context context) {
this.context = context;
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mDatas = new ArrayList<>();
viewList = new ArrayList<>();
//获取status_bar_height资源的ID
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
//根据资源ID获取响应的尺寸值
statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);
}
screenWidth = mWindowManager.getDefaultDisplay().getWidth();
//需要减去状态栏高度
screenHeight = mWindowManager.getDefaultDisplay().getHeight() - statusBarHeight;
topWidth = WindowHelper.dip2px(context, 40);
topHeight = WindowHelper.dip2px(context, 40);
bottomHeight = WindowHelper.dip2px(context, 100);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
public static WindowController getInstance(Context context) {
if (instance == null) {
synchronized (WindowController.class) {
if (instance == null) {
instance = new WindowController(context);
}
}
}
return instance;
}
/**
* 初始化
*/
public void init() {
topX = WindowHelper.getCoordinateX(context);
topY = WindowHelper.getCoordinateY(context);
bottomY = topY + topHeight;
initTop();
initBottom();
mWindowManager.addView(layoutTop, wParamsTop);
}
/**
* 初始化top视图
*/
private void initTop() {
layoutTop = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.window_top, null);
top = layoutTop.findViewById(R.id.top);
//监听触摸事件,实现拖动和点击。
top.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.e("ZXK", "MotionEvent.ACTION_DOWN");
downTime = (int) System.currentTimeMillis();
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
//保留相对距离,后面可以通过绝对坐标算出真实坐标
downX = (int) event.getX();
downY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
Log.e("ZXK", "MotionEvent.ACTION_MOVE");
if (Math.abs(event.getRawX() - lastX) > 0 || Math.abs(event.getRawY() - lastY) > 0) {
topX = (int) (event.getRawX() - downX);
//需要减去状态栏高度
topY = (int) (event.getRawY() - statusBarHeight - downY);
//top左右不能越界
if (topX < 0) {
topX = 0;
} else if ((topX + topWidth) > screenWidth) {
topX = screenWidth - topWidth;
}
wParamsTop.x = topX;
//top上下不能越界
if (topY < 0) {
topY = 0;
} else if ((topY + topHeight) > screenHeight) {
topY = screenHeight - topHeight;
}
wParamsTop.y = topY;
if (screenHeight - topY - topHeight < bottomHeight) {
bottomY = topY - bottomHeight;
} else {
bottomY = topY + topHeight;
}
wParamsBottom.y = bottomY;
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
handler.sendEmptyMessage(REFRESH);
}
break;
case MotionEvent.ACTION_UP:
int currentTime = (int) System.currentTimeMillis();
if (currentTime - downTime < 200 && Math.abs(event.getRawX() - lastX) < mTouchSlop && Math.abs(event.getRawY() - lastY) < mTouchSlop) {
handler.sendEmptyMessage(CLICK);
}
//保留坐标
WindowHelper.setCoordinateX(context, topX);
WindowHelper.set
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
MyWindowDemo.rar (49个子文件)
MyWindowDemo
.gitignore 127B
gradle
wrapper
gradle-wrapper.jar 52KB
gradle-wrapper.properties 236B
local.properties 419B
build.gradle 573B
gradlew.bat 2KB
gradlew 5KB
app
.gitignore 8B
build.gradle 1KB
proguard-rules.pro 772B
app.iml 11KB
libs
src
test
java
com
example
zxk
mywindowdemo
ExampleUnitTest.java 422B
main
AndroidManifest.xml 1006B
java
com
example
zxk
mywindowdemo
WindowController.java 13KB
WindowAdapter.java 976B
ViewAdapter.java 1KB
WindowHelper.java 2KB
MyApplication.java 2KB
MainActivity.java 2KB
WindowService.java 1KB
res
values
styles.xml 737B
colors.xml 296B
strings.xml 78B
mipmap-xxhdpi
ic_launcher_round.png 10KB
ic_launcher.png 6KB
layout
window_bottom.xml 965B
activity_main.xml 451B
layout_bottom_item_item.xml 421B
window_bottom_item.xml 472B
window_top.xml 495B
drawable-v24
ic_launcher_foreground.xml 2KB
mipmap-anydpi-v26
ic_launcher.xml 276B
ic_launcher_round.xml 276B
mipmap-xhdpi
ic_launcher_round.png 7KB
ic_launcher.png 4KB
mipmap-hdpi
ic_launcher_round.png 5KB
ic_launcher.png 3KB
drawable
on.xml 244B
off.xml 244B
radiobutton_bg.xml 272B
ic_launcher_background.xml 6KB
mipmap-mdpi
ic_launcher_round.png 3KB
ic_launcher.png 2KB
mipmap-xxxhdpi
ic_launcher_round.png 15KB
ic_launcher.png 9KB
androidTest
java
com
example
zxk
mywindowdemo
ExampleInstrumentedTest.java 783B
gradle.properties 747B
MyWindowDemo.iml 866B
settings.gradle 16B
共 49 条
- 1
资源评论
- qq1315306242019-10-09闪退,不能用
xiaozhang1993
- 粉丝: 2
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功