有句话叫:不要重复造轮子但是我想知道轮子是怎么造的
先把主题设为透明或者自定义也行,下面贴出代码,原理是通过的TouchEvent移动活动的跟视图内部内容
简单的实现功能,透明的Theme带来的动画没有显示没有处理,请自行通过搜索引擎解决
<pre name="code" class="java">private int lastY = 0;
private int lastX = 0;
private ScrollerHolder scrollerCompute;
private int windowWidth=-1;
private int downX=-1;
//根据点击坐标判断是否可以移动
private boolean canSlide=false;
//是否已经移动了
private boolean isSlide=false;
private final static int ROLLBACKTIME=500;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Resources resources = getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
float density = dm.density;
windowWidth = dm.widthPixels;
downX= (int) (30 * density + 0.5f);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
lastY=(int) ev.getRawY();
lastX=(int) ev.getRawX();
if(lastX<=downX){
canSlide=true;
}
break;
case MotionEvent.ACTION_MOVE:
if(canSlide){//如果点击的坐标满足需求
int rawY = (int) ev.getRawY();
int rawX = (int) ev.getRawX();
int moveY = rawY - lastY;
int moveX = rawX - lastX;
lastY = rawY;
lastX = rawX;
if(isSlide){
moveX(moveX);
}else {
if(moveX!=0){
if(moveY<0){
moveY=-moveY;
}
if(moveX/2>moveY){
moveX(moveX);
isSlide=true;
}
}
}
}
break;
case MotionEvent.ACTION_UP:
if(isSlide){
RecoveryContentView();
canSlide=false;
isSlide=false;
return true;
}
break;
}
return super.dispatchTouchEvent(ev);
}
private void moveX(int moveX) {
View decorView = getWindow().getDecorView();
if(-moveX+decorView.getScrollX()<0){
decorView.scrollBy(-moveX, 0);
}
}
private void RecoveryContentView(){
View decorView = getWindow().getDecorView();
if(scrollerCompute==null){
scrollerCompute=new ScrollerHolder();
}
if(decorView.getScrollX()!=0){
scrollerCompute.startScroll();
decorView.post(scrollerCompute);
}
}
class ScrollerHolder implements Runnable {
private Scroller mScroller;
public ScrollerHolder(){
mScroller=new Scroller(getApplicationContext());
}
@Override
public void run() {
View decorView = getWindow().getDecorView();
if(mScroller.computeScrollOffset()){
int scrollX = -decorView.getScrollX();
int currX =- mScroller.getCurrX();
decorView.scrollTo(currX, 0);
int scrollX2 = -decorView.getScrollX();
if(scrollX2!=0&&scrollX2!=windowWidth){
//2是我随便写的 个人觉得 不需要这么快的回调
decorView.postDelayed(this,2);
}else {
if(scrollX2==windowWidth){
Toast.makeText(getApplicationContext(), "结束当前", 0).show();
finish();
}
}
}
}
public void startScroll(){
View decorView = getWindow().getDecorView();
int scrollX = -decorView.getScrollX();
int recoveryX=0;
if(scrollX>windowWidth/2){
recoveryX=windowWidth;
}
mScroller.startScroll(scrollX, 0, recoveryX-scrollX, 0, ROLLBACKTIME);
}
}