package com.hsae.hiboardservice.view;
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import com.hsae.hiboardservice.R;
import com.hsae.hiboardservice.utils.LogUtils;
import com.hsae.hiboardservice.utils.Utilties;
import static com.hsae.hiboardservice.common.Messages.WHAT_UPDATE_SCROLL;
public class HiboardWorkspace extends FrameLayout{
private final static String TAG = HiboardWorkspace.class.getSimpleName();
private static final float RETURN_TO_ORIGINAL_PAGE_THRESHOLD = 0.12f;
private Messenger mRemoteMessenger;
private boolean canScroll = true;
private int startX;
public float curOffsetProgress;
private int width;
private boolean isLeftmostWorkspaceShown = false;
ValueAnimator animator;
boolean toDesktop = false;
boolean onHomeKey = false;
private int mLastXIntercept;
private int mLastYIntercept;
private long beginScrollTime;
private String error = null;
public HiboardWorkspace(@NonNull Context context) {
this(context, null);
}
public HiboardWorkspace(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, -1);
}
public HiboardWorkspace(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, -1);
}
public HiboardWorkspace(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init(){
width = Utilties.getScreenMaxWidth(getContext());
}
public void setMessenger(Messenger mMessenger) {
this.mRemoteMessenger = mMessenger;
}
public void setCanScroll(boolean canScroll) {
this.canScroll = canScroll;
}
private boolean canScroll() {
return canScroll;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercepted = false;
int x = (int) ev.getRawX();
int y = (int) ev.getRawY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = x;
//startY = y;
intercepted = false;
break;
case MotionEvent.ACTION_MOVE:
if (!canScroll()) {
return false;
}
int deltaX = x - mLastXIntercept;
int deltaY = y - mLastYIntercept;
intercepted = Math.abs(deltaX) > Math.abs(deltaY);
if(intercepted){
onTouchEvent(ev);
}
break;
case MotionEvent.ACTION_UP:
intercepted = false;
break;
default:
break;
}
mLastXIntercept = x;
mLastYIntercept = y;
return intercepted;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getRawX();
int y = (int) event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// yzd 只有当处于正常模式时才能滑动到负一屏
if (!canScroll()) {
return false;
}
break;
case MotionEvent.ACTION_MOVE:
if (x < startX) {
curOffsetProgress = (float) ((width - startX + x)/(width * 1.0));
updateViewAlpha();
Message msg = Message.obtain(null, WHAT_UPDATE_SCROLL);
msg.arg1 = Float.floatToIntBits(curOffsetProgress);
sendRemote(msg);
setTranslationX(-(1 - curOffsetProgress) * width);
}
break;
case MotionEvent.ACTION_UP:
if (x < startX) {
if (curOffsetProgress <= 1 - RETURN_TO_ORIGINAL_PAGE_THRESHOLD) {
startProcessAnimator(curOffsetProgress, 0);
} else {
startProcessAnimator(curOffsetProgress, 1);
}
}
break;
default:break;
}
return true;
}
private synchronized boolean sendRemote(Message msg) {
if (this.mRemoteMessenger == null) {
LogUtils.d(TAG, "sendRemote mRemoteMessenger is null");
return false;
}
try {
this.mRemoteMessenger.send(msg);
return true;
} catch (RemoteException e) {
handleConnectionError(e);
}
return false;
}
private synchronized void handleConnectionError(RemoteException e) {
LogUtils.e(TAG, " handleConnectionError: " + e.getMessage());
}
public void startProcessAnimator(float from, float to) {
isLeftmostWorkspaceShown = to == 1;
if (animator != null && animator.isRunning()) {
animator.cancel();
}
animator = ValueAnimator.ofFloat(from, to);
animator.setDuration(200);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float offset = (float)animation.getAnimatedValue();
curOffsetProgress = offset;
Message msg = Message.obtain(null, WHAT_UPDATE_SCROLL);
msg.arg1 = Float.floatToIntBits(curOffsetProgress);
sendRemote(msg);
setTranslationX(-(1 - curOffsetProgress) * width);
updateViewAlpha();
if (curOffsetProgress == 1) {
if (!toDesktop && !onHomeKey) {
//onLeftmostShow();
}
toDesktop = false;
}
if (curOffsetProgress == 0 && onHomeKey) {
onHomeKey = false;
}
}
});
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
if(curOffsetProgress == 0) {
setVisibility(GONE);
}else{
setVisibility(VISIBLE);
}
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animator.start();
}
public void onResume() {
LogUtils.i(TAG, "onResume curOffsetProgress: " + curOffsetProgress);
if (curOffsetProgress == 0) {
width = Utilties.getScreenMaxWidth(getContext());
setTranslationX(-width);
} else {
//onLeftmostShow();
//sortCardsUI();
}
}
public void onPause() {
LogUtils.i(TAG, "onPause");
hide();
}
/**
* 隐藏负一屏
*/
public void hide(){
setTranslationX(-width);
setVisibility(GONE);
startProcessAnimator(curOffsetProgress, 0);
curOffsetProgress = 0;
Message msg = Mes
没有合适的资源?快使用搜索试试~ 我知道了~
android负一屏服务端实现及对应的客户端demo
共66个文件
png:20个
xml:18个
java:14个
4星 · 超过85%的资源 需积分: 49 66 下载量 170 浏览量
2020-06-23
17:49:10
上传
评论 1
收藏 194KB ZIP 举报
温馨提示
利用Google的feed屏方案,导入google官方定义了两个interface接口,ILauncherOverlay和ILauncherOverlayCallback通过aidl进程间通信,从Launcher向负一屏app传递scroll数据,负一屏使用WindowManager.addView的方式添加浮动窗口,用translationX改变负一屏View的位置。 优点:与Launcher完美解耦,运行在独立的进程里,不存在影响Launcher内存问题。 缺点:负一屏View的实现难度大。
资源推荐
资源详情
资源评论
收起资源包目录
hiboardServiceAndClient.zip (66个子文件)
hiboardservice
.gitignore 8B
build.gradle 930B
src
androidTest
java
com
hsae
hiboardservice
ExampleInstrumentedTest.java~ 752B
ExampleInstrumentedTest.java 752B
main
AndroidManifest.xml 820B
res
mipmap-xhdpi
ic_launcher_round.png 7KB
ic_launcher.png 5KB
mipmap-mdpi
ic_launcher_round.png 3KB
ic_launcher.png 3KB
layout
hiboard_view.xml 357B
mipmap-xxhdpi
ic_launcher_round.png 12KB
ic_launcher.png 8KB
drawable
ic_launcher_background.xml 6KB
mipmap-anydpi-v26
ic_launcher_round.xml 276B
ic_launcher.xml 276B
drawable-v24
ic_launcher_foreground.xml 2KB
mipmap-hdpi
ic_launcher_round.png 5KB
ic_launcher.png 4KB
mipmap-xxxhdpi
ic_launcher_round.png 16KB
ic_launcher.png 10KB
values
strings.xml 80B
colors.xml 214B
styles.xml 394B
java
com
hsae
hiboardservice
view
HiboardWorkspace.java 10KB
HiboardWorkspace.java~ 10KB
HiboardService.java 6KB
utils
Utilties.java~ 826B
Utilties.java 826B
LogUtils.java 849B
LogUtils.java~ 849B
HiboardService.java~ 6KB
common
Messages.java 542B
test
java
com
hsae
hiboardservice
ExampleUnitTest.java 385B
ExampleUnitTest.java~ 385B
libs
proguard-rules.pro 772B
hiboardservice.iml 12KB
hiboardlauncher
.gitignore 8B
build.gradle 1008B
src
androidTest
java
com
hsae
hiboardlauncher
ExampleInstrumentedTest.java 754B
main
AndroidManifest.xml 826B
res
mipmap-xhdpi
ic_launcher_round.png 7KB
ic_launcher.png 5KB
mipmap-mdpi
ic_launcher_round.png 3KB
ic_launcher.png 3KB
layout
activity_main.xml 787B
mipmap-xxhdpi
ic_launcher_round.png 12KB
ic_launcher.png 8KB
drawable
ic_launcher_background.xml 6KB
mipmap-anydpi-v26
ic_launcher_round.xml 276B
ic_launcher.xml 276B
drawable-v24
ic_launcher_foreground.xml 2KB
mipmap-hdpi
ic_launcher_round.png 5KB
ic_launcher.png 4KB
mipmap-xxxhdpi
ic_launcher_round.png 16KB
ic_launcher.png 10KB
values
strings.xml 81B
colors.xml 214B
styles.xml 392B
java
com
hsae
hiboardlauncher
MainActivity.java 7KB
MyApplication.java 2KB
utils
Utilties.java 827B
LogUtils.java 851B
common
Messages.java 543B
test
java
com
hsae
hiboardlauncher
ExampleUnitTest.java 386B
hiboardlauncher.iml 12KB
libs
proguard-rules.pro 772B
共 66 条
- 1
资源评论
- zougui08122020-11-30老板便宜点嘛
- znlkyzdn2020-11-25老板便宜点嘛
- u0110690592020-07-23老板便宜点嘛
- 「已注销」2021-04-02代码是App左滑后出现的屏幕,跟Launcher负一屏没关系.
sailyourdream1
- 粉丝: 9
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功