package com.qin.scrollerview;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Scroller;
public class MultiViewGroup extends ViewGroup {
private Context mContext;
private static String TAG = "MultiViewGroup";
private int curScreen = 0 ;
private Scroller mScroller = null ;
private static final int TOUCH_STATE_REST = 0;
private static final int TOUCH_STATE_SCROLLING = 1;
private int mTouchState = TOUCH_STATE_REST;
public static int SNAP_VELOCITY = 600 ;
private int mTouchSlop = 0 ;
private float mLastionMotionX = 0 ;
private float mLastMotionY = 0 ;
private VelocityTracker mVelocityTracker = null ;
public MultiViewGroup(Context context) {
super(context);
mContext = context;
init();
}
public MultiViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
init();
}
private void init() {
mScroller = new Scroller(mContext);
LinearLayout oneLL = new LinearLayout(mContext);
oneLL.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg1));
addView(oneLL);
LinearLayout twoLL = new LinearLayout(mContext);
twoLL.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg2));
addView(twoLL);
LinearLayout threeLL = new LinearLayout(mContext);
threeLL.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg3));
addView(threeLL);
LinearLayout fourLL = new LinearLayout(mContext);
fourLL.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg4));
addView(fourLL);
mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
}
public void moveToLeftSide(){
if (curScreen >= getChildCount() - 1) {
return;
}
curScreen++ ;
Log.i(TAG, "----moveToLeftSide---- curScreen " + curScreen);
Log.i(TAG, "----width " + getWidth());
mScroller.startScroll((curScreen-1) * getWidth(), 0, getWidth(), 0, 3000);
scrollTo(curScreen * getWidth(), 0);
invalidate();
}
public void moveToRightSide(){
if (curScreen <= 0) {
return;
}
curScreen-- ;
Log.i(TAG, "----moveToRightSide---- curScreen " + curScreen);
mScroller.startScroll((curScreen + 1) * getWidth(), 0, -getWidth(), 0, 3000);
scrollTo(curScreen * getWidth(), 0);
invalidate();
}
public void stopMove(){
Log.v(TAG, "----stopMove ----");
if(mScroller != null){
if(!mScroller.isFinished()){
int scrollCurX= mScroller.getCurrX() ;
//calculate destination screen
int descScreen = ( scrollCurX + getWidth() / 2) / getWidth() ;
Log.i(TAG, "----mScroller.is not finished ---- shouldNext" + descScreen);
Log.i(TAG, "----mScroller.is not finished ---- scrollCurX " + scrollCurX);
mScroller.abortAnimation();
scrollTo(descScreen * getWidth() , 0);
mScroller.forceFinished(true);
curScreen = descScreen ;
}
}
else
Log.i(TAG, "----OK mScroller.is finished ---- ");
}
@Override
public void computeScroll() {
// TODO Auto-generated method stub
Log.e(TAG, "computeScroll");
if (mScroller.computeScrollOffset()) {
Log.e(TAG, mScroller.getCurrX() + "======" + mScroller.getCurrY());
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
Log.e(TAG, "### getleft is " + getLeft() + " ### getRight is " + getRight());
postInvalidate();
}
else
Log.i(TAG, "have done the scoller -----");
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
Log.e(TAG, "onInterceptTouchEvent-slop:" + mTouchSlop);
final int action = ev.getAction();
if ((action == MotionEvent.ACTION_MOVE) && (mTouchState != TOUCH_STATE_REST)) {
return true;
}
final float x = ev.getX();
final float y = ev.getY();
switch (action) {
case MotionEvent.ACTION_MOVE:
Log.e(TAG, "onInterceptTouchEvent move");
final int xDiff = (int) Math.abs(mLastionMotionX - x);
if (xDiff > mTouchSlop) {
mTouchState = TOUCH_STATE_SCROLLING;
}
break;
case MotionEvent.ACTION_DOWN:
Log.e(TAG, "onInterceptTouchEvent down");
mLastionMotionX = x;
mLastMotionY = y;
Log.e(TAG, "scroller is finished" + mScroller.isFinished() + "");
mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST : TOUCH_STATE_SCROLLING;
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
Log.e(TAG, "onInterceptTouchEvent up or cancel");
mTouchState = TOUCH_STATE_REST;
break;
}
Log.e(TAG, mTouchState + "====" + TOUCH_STATE_REST);
return mTouchState != TOUCH_STATE_REST;
}
public boolean onTouchEvent(MotionEvent event){
Log.i(TAG, "--- onTouchEvent--> " );
// TODO Auto-generated method stub
Log.e(TAG, "onTouchEvent start");
if (mVelocityTracker == null) {
Log.e(TAG, "onTouchEvent start-------** VelocityTracker.obtain");
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
super.onTouchEvent(event);
float x = event.getX();
float y = event.getY();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
if(mScroller != null){
if(!mScroller.isFinished()){
mScroller.abortAnimation();
}
}
mLastionMotionX = x ;
break ;
case MotionEvent.ACTION_MOVE:
int deltaX = (int)(mLastionMotionX - x );
int deltaY = (int)(mLastMotionY - y);
if (Math.abs(deltaX) < Math.abs(deltaY)) {
break;
}
scrollBy(deltaX, 0);
Log.e(TAG, "--- MotionEvent.ACTION_MOVE--> detaX is " + deltaX );
mLastionMotionX = x ;
break ;
case MotionEvent.ACTION_UP:
final VelocityTracker velocityTracker = mVelocityTracker ;
velocityTracker.computeCurrentVelocity(1000);
int velocityX = (int) velocityTracker.getXVelocity() ;
Log.e(TAG , "---velocityX---" + velocityX);
if (velocityX > SNAP_VELOCITY && curScreen > 0) {
// Fling enough to move left
Log.e(TAG, "snap left");
snapToScreen(curScreen - 1);
}
else if(velocityX < -SNAP_VELOCITY && curScreen < (getChildCount()-1)){
Log.e(TAG, "snap right");
snapToScreen(curScreen + 1);
}
else{
snapToDestination();
}
if (mVelocityTracker != null) {
mVelocityTracker.recycle();
mVelocityTracker = null;
}
mTouchState = TOUCH_STATE_REST ;
break;
case MotionEvent.ACTION_CANCEL:
mTouchState = TOUCH_STATE_REST ;
break;
}
return true ;
}
private void snapToDestination(){
int scrollX = getScrollX() ;
int scrollY = getScrollY() ;
Log.e(TAG, "### onTouchEvent snapToDestination ### scrollX is " + scr
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
D_ScrollerView.rar (56个子文件)
D_ScrollerView
bin
D_ScrollerView.apk 19KB
classes.dex 11KB
com
qin
scrollerview
MultiViewGroup.class 8KB
MainActivity.class 2KB
MultiScreenActivity.class 2KB
R$layout.class 433B
R$id.class 540B
R$drawable.class 406B
R$attr.class 346B
R.class 545B
R$string.class 433B
qom
qin
scrollerview
resources.ap_ 12KB
res
drawable-ldpi
icon.png 2KB
drawable-hdpi
bg3.jpg 177KB
bg4.jpg 157KB
icon.png 4KB
bg2.jpg 195KB
bg1.jpg 165KB
values
strings.xml 174B
drawable-mdpi
icon.png 3KB
layout
main.xml 995B
multiview.xml 1KB
assets
default.properties 364B
gen
com
qin
scrollerview
BuildConfig.java 262B
R.java 1KB
Manifest.java 190B
qom
qin
scrollerview
src
com
qin
scrollerview
MultiViewGroup.java 10KB
MultiScreenActivity.java 2KB
MainActivity.java 2KB
.idea
uiDesigner.xml 9KB
scopes
scope_settings.xml 143B
misc.xml 830B
vcs.xml 173B
.name 14B
copyright
profiles_settings.xml 115B
modules.xml 279B
encodings.xml 171B
compiler.xml 734B
workspace.xml 40KB
checkstyle-idea.xml 307B
.project 850B
.classpath 280B
D_ScrollerView.iml 709B
out
production
D_ScrollerView
D_ScrollerView.apk 715KB
com
qin
scrollerview
MultiViewGroup.class 8KB
MainActivity.class 2KB
BuildConfig.class 349B
MultiScreenActivity.class 3KB
R$layout.class 433B
R$id.class 681B
R$drawable.class 514B
R$attr.class 346B
R.class 549B
R$string.class 433B
D_ScrollerView.unaligned.apk 715KB
AndroidManifest.xml 1KB
共 56 条
- 1
bigconvience
- 粉丝: 335
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页