版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)滑動(dòng)分頁(yè)功能
這篇文章給大家介紹Android中怎么實(shí)現(xiàn)滑動(dòng)分頁(yè)功能,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。Java代碼:package
cn.anycall.ju;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;
import
android.app.Activity;
import
android.content.ActivityNotFoundException;
import
android.content.Context;
import
android.content.Intent;
import
android.content.pm.ResolveInfo;
import
android.os.Bundle;
import
android.os.Handler;
import
android.os.Looper;
import
android.os.Message;
import
android.view.KeyEvent;
import
android.view.View;
import
android.view.Window;
import
android.widget.AdapterView;
import
android.widget.AdapterView.OnItemClickListener;
import
android.widget.GridView;
import
android.widget.Toast;
import
cn.anycall.ju.ScrollLayout.OnScreenChangeListenerDataLoad;
/**
*
GridView分頁(yè)顯示安裝的應(yīng)用程序
*/
public
class
AllAppList
extends
Activity
{
private
ScrollLayout
mScrollLayout;
private
static
final
float
APP_PAGE_SIZE
=
4.0f;
private
Context
mContext;
private
PageControlView
pageControl;
public
MyHandler
myHandler;
public
int
n=0;
private
DataLoading
dataLoad;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
//
TODO
Auto-generated
method
stub
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
mContext
=
this;
setContentView(R.layout.main);
dataLoad
=
new
DataLoading();
mScrollLayout
=
(ScrollLayout)findViewById(R.id.ScrollLayoutTest);
myHandler
=
new
MyHandler(this,1);
//起一個(gè)線程更新數(shù)據(jù)
MyThread
m
=
new
MyThread();
new
Thread(m).start();
}
/**
*
gridView
的onItemLick響應(yīng)事件
*/
public
OnItemClickListener
listener
=
new
OnItemClickListener()
{
public
void
onItemClick(AdapterView<?>
parent,
View
view,
int
position,
long
id)
{
//
TODO
Auto-generated
method
stub
System.out.println("position="+position);
}
};
@Override
protected
void
onDestroy()
{
//
TODO
Auto-generated
method
stub
android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
}
@Override
public
boolean
onKeyDown(int
keyCode,
KeyEvent
event)
{
//
TODO
Auto-generated
method
stub
if
(keyCode
==
KeyEvent.KEYCODE_BACK)
{
finish();
return
true;
}
return
super.onKeyDown(keyCode,
event);
}
//
更新后臺(tái)數(shù)據(jù)
class
MyThread
implements
Runnable
{
public
void
run()
{
try
{
Thread.sleep(1000*3);
}
catch
(InterruptedException
e)
{
//
TODO
Auto-generated
catch
block
e.printStackTrace();
}
String
msglist
=
"1";
Message
msg
=
new
Message();
Bundle
b
=
new
Bundle();//
存放數(shù)據(jù)
b.putString("rmsg",
msglist);
msg.setData(b);
AllAppList.this.myHandler.sendMessage(msg);
//
向Handler發(fā)送消息,更新UI
}
}
class
MyHandler
extends
Handler
{
private
AllAppList
mContext;
public
MyHandler(Context
conn,int
a)
{
mContext
=
(AllAppList)conn;
}
public
MyHandler(Looper
L)
{
super(L);
}
//
子類必須重寫此方法,接受數(shù)據(jù)
@Override
public
void
handleMessage(Message
msg)
{
//
TODO
Auto-generated
method
stub
super.handleMessage(msg);
Bundle
b
=
msg.getData();
String
rmsg
=
b.getString("rmsg");
if
("1".equals(rmsg))
{
//
do
nothing
List<Map>
list
=
new
ArrayList<Map>();
for(int
i
=0;i<16;i++){
n++;
Map
map
=
new
HashMap();
map.put("name",
n);
list.add(map);
}
int
pageNo
=
(int)Math.ceil(
list.size()/APP_PAGE_SIZE);
for
(int
i
=
0;
i
<
pageNo;
i++)
{
GridView
appPage
=
new
GridView(mContext);
//
get
the
"i"
page
data
appPage.setAdapter(new
AppAdapter(mContext,
list,
i));
appPage.setNumColumns(2);
appPage.setOnItemClickListener(listener);
mScrollLayout.addView(appPage);
}
//加載分頁(yè)
pageControl
=
(PageControlView)
findViewById(R.id.pageControl);
pageControl.bindScrollViewGroup(mScrollLayout);
//加載分頁(yè)數(shù)據(jù)
dataLoad.bindScrollViewGroup(mScrollLayout);
}
}
}
//分頁(yè)數(shù)據(jù)
class
DataLoading
{
private
int
count;
public
void
bindScrollViewGroup(ScrollLayout
scrollViewGroup)
{
this.count=scrollViewGroup.getChildCount();
scrollViewGroup.setOnScreenChangeListenerDataLoad(new
OnScreenChangeListenerDataLoad()
{
public
void
onScreenChange(int
currentIndex)
{
//
TODO
Auto-generated
method
stub
generatePageControl(currentIndex);
}
});
}
private
void
generatePageControl(int
currentIndex){
//如果到最后一頁(yè),就加載16條記錄
if(count==currentIndex+1){
MyThread
m
=
new
MyThread();
new
Thread(m).start();
}
}
}
}Java代碼:package
cn.anycall.ju;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;
import
android.app.Activity;
import
android.content.ActivityNotFoundException;
import
android.content.Context;
import
android.content.Intent;
import
android.content.pm.ResolveInfo;
import
android.os.Bundle;
import
android.os.Handler;
import
android.os.Looper;
import
android.os.Message;
import
android.view.KeyEvent;
import
android.view.View;
import
android.view.Window;
import
android.widget.AdapterView;
import
android.widget.AdapterView.OnItemClickListener;
import
android.widget.GridView;
import
android.widget.Toast;
import
cn.anycall.ju.ScrollLayout.OnScreenChangeListenerDataLoad;
/**
*
GridView分頁(yè)顯示安裝的應(yīng)用程序
*/
public
class
AllAppList
extends
Activity
{
private
ScrollLayout
mScrollLayout;
private
static
final
float
APP_PAGE_SIZE
=
4.0f;
private
Context
mContext;
private
PageControlView
pageControl;
public
MyHandler
myHandler;
public
int
n=0;
private
DataLoading
dataLoad;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
//
TODO
Auto-generated
method
stub
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
mContext
=
this;
setContentView(R.layout.main);
dataLoad
=
new
DataLoading();
mScrollLayout
=
(ScrollLayout)findViewById(R.id.ScrollLayoutTest);
myHandler
=
new
MyHandler(this,1);
//起一個(gè)線程更新數(shù)據(jù)
MyThread
m
=
new
MyThread();
new
Thread(m).start();
}
/**
*
gridView
的onItemLick響應(yīng)事件
*/
public
OnItemClickListener
listener
=
new
OnItemClickListener()
{
public
void
onItemClick(AdapterView<?>
parent,
View
view,
int
position,
long
id)
{
//
TODO
Auto-generated
method
stub
System.out.println("position="+position);
}
};
@Override
protected
void
onDestroy()
{
//
TODO
Auto-generated
method
stub
android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
}
@Override
public
boolean
onKeyDown(int
keyCode,
KeyEvent
event)
{
//
TODO
Auto-generated
method
stub
if
(keyCode
==
KeyEvent.KEYCODE_BACK)
{
finish();
return
true;
}
return
super.onKeyDown(keyCode,
event);
}
//
更新后臺(tái)數(shù)據(jù)
class
MyThread
implements
Runnable
{
public
void
run()
{
try
{
Thread.sleep(1000*3);
}
catch
(InterruptedException
e)
{
//
TODO
Auto-generated
catch
block
e.printStackTrace();
}
String
msglist
=
"1";
Message
msg
=
new
Message();
Bundle
b
=
new
Bundle();//
存放數(shù)據(jù)
b.putString("rmsg",
msglist);
msg.setData(b);
AllAppList.this.myHandler.sendMessage(msg);
//
向Handler發(fā)送消息,更新UI
}
}
class
MyHandler
extends
Handler
{
private
AllAppList
mContext;
public
MyHandler(Context
conn,int
a)
{
mContext
=
(AllAppList)conn;
}
public
MyHandler(Looper
L)
{
super(L);
}
//
子類必須重寫此方法,接受數(shù)據(jù)
@Override
public
void
handleMessage(Message
msg)
{
//
TODO
Auto-generated
method
stub
super.handleMessage(msg);
Bundle
b
=
msg.getData();
String
rmsg
=
b.getString("rmsg");
if
("1".equals(rmsg))
{
//
do
nothing
List<Map>
list
=
new
ArrayList<Map>();
for(int
i
=0;i<16;i++){
n++;
Map
map
=
new
HashMap();
map.put("name",
n);
list.add(map);
}
int
pageNo
=
(int)Math.ceil(
list.size()/APP_PAGE_SIZE);
for
(int
i
=
0;
i
<
pageNo;
i++)
{
GridView
appPage
=
new
GridView(mContext);
//
get
the
"i"
page
data
appPage.setAdapter(new
AppAdapter(mContext,
list,
i));
appPage.setNumColumns(2);
appPage.setOnItemClickListener(listener);
mScrollLayout.addView(appPage);
}
//加載分頁(yè)
pageControl
=
(PageControlView)
findViewById(R.id.pageControl);
pageControl.bindScrollViewGroup(mScrollLayout);
//加載分頁(yè)數(shù)據(jù)
dataLoad.bindScrollViewGroup(mScrollLayout);
}
}
}
//分頁(yè)數(shù)據(jù)
class
DataLoading
{
private
int
count;
public
void
bindScrollViewGroup(ScrollLayout
scrollViewGroup)
{
this.count=scrollViewGroup.getChildCount();
scrollViewGroup.setOnScreenChangeListenerDataLoad(new
OnScreenChangeListenerDataLoad()
{
public
void
onScreenChange(int
currentIndex)
{
//
TODO
Auto-generated
method
stub
generatePageControl(currentIndex);
}
});
}
private
void
generatePageControl(int
currentIndex){
//如果到最后一頁(yè),就加載16條記錄
if(count==currentIndex+1){
MyThread
m
=
new
MyThread();
new
Thread(m).start();
}
}
}
}Java代碼:package
cn.anycall.ju;
import
java.util.ArrayList;
import
java.util.List;
import
java.util.Map;
import
android.content.Context;
import
android.content.pm.PackageManager;
import
android.content.pm.ResolveInfo;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.ViewGroup;
import
android.widget.BaseAdapter;
import
android.widget.ImageView;
import
android.widget.TextView;
import
cn.anycall.ju.R;
public
class
AppAdapter
extends
BaseAdapter
{
private
List<Map>
mList;
private
Context
mContext;
public
static
final
int
APP_PAGE_SIZE
=
4;
private
PackageManager
pm;
public
AppAdapter(Context
context,
List<Map>
list,
int
page)
{
mContext
=
context;
pm
=
context.getPackageManager();
mList
=
new
ArrayList<Map>();
int
i
=
page
*
APP_PAGE_SIZE;
int
iEnd
=
i+APP_PAGE_SIZE;
while
((i<list.size())
&&
(i<iEnd))
{
mList.add(list.get(i));
i++;
}
}
public
int
getCount()
{
//
TODO
Auto-generated
method
stub
return
mList.size();
}
public
Object
getItem(int
position)
{
//
TODO
Auto-generated
method
stub
return
mList.get(position);
}
public
long
getItemId(int
position)
{
//
TODO
Auto-generated
method
stub
return
position;
}
public
View
getView(int
position,
View
convertView,
ViewGroup
parent)
{
//
TODO
Auto-generated
method
stub
Map
appInfo
=
mList.get(position);
AppItem
appItem;
if
(convertView
==
null)
{
View
v
=
LayoutInflater.from(mContext).inflate(R.layout.app_item,
null);
appItem
=
new
AppItem();
appItem.mAppIcon
=
(ImageView)v.findViewById(R.id.imgdetail);
appItem.mAppName
=
(TextView)v.findViewById(R.id.tuaninfo);
v.setTag(appItem);
convertView
=
v;
}
else
{
appItem
=
(AppItem)convertView.getTag();
}
//
set
the
icon
appItem.mAppIcon.setImageResource(R.drawable.icon);
//
set
the
app
name
appItem.mAppName.setText(appInfo.get("name").toString());
return
convertView;
}
/**
*
每個(gè)應(yīng)用顯示的內(nèi)容,包括圖標(biāo)和名稱
*
@author
Yao.GUET
*
*/
class
AppItem
{
ImageView
mAppIcon;
TextView
mAppName;
}
}Java代碼:package
cn.anycall.ju;
import
java.util.ArrayList;
import
java.util.List;
import
java.util.Map;
import
android.content.Context;
import
android.content.pm.PackageManager;
import
android.content.pm.ResolveInfo;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.ViewGroup;
import
android.widget.BaseAdapter;
import
android.widget.ImageView;
import
android.widget.TextView;
import
cn.anycall.ju.R;
public
class
AppAdapter
extends
BaseAdapter
{
private
List<Map>
mList;
private
Context
mContext;
public
static
final
int
APP_PAGE_SIZE
=
4;
private
PackageManager
pm;
public
AppAdapter(Context
context,
List<Map>
list,
int
page)
{
mContext
=
context;
pm
=
context.getPackageManager();
mList
=
new
ArrayList<Map>();
int
i
=
page
*
APP_PAGE_SIZE;
int
iEnd
=
i+APP_PAGE_SIZE;
while
((i<list.size())
&&
(i<iEnd))
{
mList.add(list.get(i));
i++;
}
}
public
int
getCount()
{
//
TODO
Auto-generated
method
stub
return
mList.size();
}
public
Object
getItem(int
position)
{
//
TODO
Auto-generated
method
stub
return
mList.get(position);
}
public
long
getItemId(int
position)
{
//
TODO
Auto-generated
method
stub
return
position;
}
public
View
getView(int
position,
View
convertView,
ViewGroup
parent)
{
//
TODO
Auto-generated
method
stub
Map
appInfo
=
mList.get(position);
AppItem
appItem;
if
(convertView
==
null)
{
View
v
=
LayoutInflater.from(mContext).inflate(R.layout.app_item,
null);
appItem
=
new
AppItem();
appItem.mAppIcon
=
(ImageView)v.findViewById(R.id.imgdetail);
appItem.mAppName
=
(TextView)v.findViewById(R.id.tuaninfo);
v.setTag(appItem);
convertView
=
v;
}
else
{
appItem
=
(AppItem)convertView.getTag();
}
//
set
the
icon
appItem.mAppIcon.setImageResource(R.drawable.icon);
//
set
the
app
name
appItem.mAppName.setText(appInfo.get("name").toString());
return
convertView;
}
/**
*
每個(gè)應(yīng)用顯示的內(nèi)容,包括圖標(biāo)和名稱
*
@author
Yao.GUET
*
*/
class
AppItem
{
ImageView
mAppIcon;
TextView
mAppName;
}
}Java代碼:package
cn.anycall.ju;
import
android.content.Context;
import
android.util.AttributeSet;
import
android.widget.ImageView;
import
android.widget.LinearLayout;
import
cn.anycall.ju.R;
import
cn.anycall.ju.ScrollLayout.OnScreenChangeListener;
public
class
PageControlView
extends
LinearLayout
{
private
Context
context;
private
int
count;
public
void
bindScrollViewGroup(ScrollLayout
scrollViewGroup)
{
this.count=scrollViewGroup.getChildCount();
System.out.println("count="+count);
generatePageControl(scrollViewGroup.getCurrentScreenIndex());
scrollViewGroup.setOnScreenChangeListener(new
OnScreenChangeListener()
{
public
void
onScreenChange(int
currentIndex)
{
//
TODO
Auto-generated
method
stub
generatePageControl(currentIndex);
}
});
}
public
PageControlView(Context
context)
{
super(context);
this.init(context);
}
public
PageControlView(Context
context,
AttributeSet
attrs)
{
super(context,
attrs);
this.init(context);
}
private
void
init(Context
context)
{
this.context=context;
}
private
void
generatePageControl(int
currentIndex)
{
this.removeAllViews();
int
pageNum
=
6;
//
顯示多少個(gè)
int
pageNo
=
currentIndex+1;
//第幾頁(yè)
int
pageSum
=
this.count;
//總共多少頁(yè)
if(pageSum>1){
int
currentNum
=
(pageNo
%
pageNum
==
0
?
(pageNo
/
pageNum)
-
1
:
(int)
(pageNo
/
pageNum))
*
pageNum;
if
(currentNum
<
0)
currentNum
=
0;
if
(pageNo
>
pageNum){
ImageView
imageView
=
new
ImageView(context);
imageView.setImageResource(R.drawable.zuo);
this.addView(imageView);
}
for
(int
i
=
0;
i
<
pageNum;
i++)
{
if
((currentNum
+
i
+
1)
>
pageSum
||
pageSum
<
2)
break;
ImageView
imageView
=
new
ImageView(context);
if(currentNum
+
i
+
1
==
pageNo){
imageView.setImageResource(R.drawable.page_indicator_focused);
}else{
imageView.setImageResource(R.drawable.page_indicator);
}
this.addView(imageView);
}
if
(pageSum
>
(currentNum
+
pageNum))
{
ImageView
imageView
=
new
ImageView(context);
imageView.setImageResource(R.drawable.you);
this.addView(imageView);
}
}
}
}Java代碼:package
cn.anycall.ju;
import
android.content.Context;
import
android.util.AttributeSet;
import
android.widget.ImageView;
import
android.widget.LinearLayout;
import
cn.anycall.ju.R;
import
cn.anycall.ju.ScrollLayout.OnScreenChangeListener;
public
class
PageControlView
extends
LinearLayout
{
private
Context
context;
private
int
count;
public
void
bindScrollViewGroup(ScrollLayout
scrollViewGroup)
{
this.count=scrollViewGroup.getChildCount();
System.out.println("count="+count);
generatePageControl(scrollViewGroup.getCurrentScreenIndex());
scrollViewGroup.setOnScreenChangeListener(new
OnScreenChangeListener()
{
public
void
onScreenChange(int
currentIndex)
{
//
TODO
Auto-generated
method
stub
generatePageControl(currentIndex);
}
});
}
public
PageControlView(Context
context)
{
super(context);
this.init(context);
}
public
PageControlView(Context
context,
AttributeSet
attrs)
{
super(context,
attrs);
this.init(context);
}
private
void
init(Context
context)
{
this.context=context;
}
private
void
generatePageControl(int
currentIndex)
{
this.removeAllViews();
int
pageNum
=
6;
//
顯示多少個(gè)
int
pageNo
=
currentIndex+1;
//第幾頁(yè)
int
pageSum
=
this.count;
//總共多少頁(yè)
if(pageSum>1){
int
currentNum
=
(pageNo
%
pageNum
==
0
?
(pageNo
/
pageNum)
-
1
:
(int)
(pageNo
/
pageNum))
*
pageNum;
if
(currentNum
<
0)
currentNum
=
0;
if
(pageNo
>
pageNum){
ImageView
imageView
=
new
ImageView(context);
imageView.setImageResource(R.drawable.zuo);
this.addView(imageView);
}
for
(int
i
=
0;
i
<
pageNum;
i++)
{
if
((currentNum
+
i
+
1)
>
pageSum
||
pageSum
<
2)
break;
ImageView
imageView
=
new
ImageView(context);
if(currentNum
+
i
+
1
==
pageNo){
imageView.setImageResource(R.drawable.page_indicator_focused);
}else{
imageView.setImageResource(R.drawable.page_indicator);
}
this.addView(imageView);
}
if
(pageSum
>
(currentNum
+
pageNum))
{
ImageView
imageView
=
new
ImageView(context);
imageView.setImageResource(R.drawable.you);
this.addView(imageView);
}
}
}
}Java代碼:package
cn.anycall.ju;
import
android.content.Context;
import
android.graphics.Canvas;
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.Scroller;
/**
*
仿Launcher中的WorkSapce,可以左右滑動(dòng)切換屏幕的類
*
*/
public
class
ScrollLayout
extends
ViewGroup
{
private
static
final
String
TAG
=
"ScrollLayout";
private
Scroller
mScroller;
private
VelocityTracker
mVelocityTracker;
private
int
mCurScreen;
private
int
mDefaultScreen
=
0;
private
static
final
int
TOUCH_STATE_REST
=
0;
private
static
final
int
TOUCH_STATE_SCROLLING
=
1;
private
static
final
int
SNAP_VELOCITY
=
600;
private
int
mTouchState
=
TOUCH_STATE_REST;
private
int
mTouchSlop;
private
float
mLastMotionX;
private
float
mLastMotionY;
private
int
currentScreenIndex
=
0;
public
int
getCurrentScreenIndex()
{
return
currentScreenIndex;
}
public
void
setCurrentScreenIndex(int
currentScreenIndex)
{
this.currentScreenIndex
=
currentScreenIndex;
}
public
ScrollLayout(Context
context,
AttributeSet
attrs)
{
this(context,
attrs,
0);
//
TODO
Auto-generated
constructor
stub
}
public
ScrollLayout(Context
context,
AttributeSet
attrs,
int
defStyle)
{
super(context,
attrs,
defStyle);
//
TODO
Auto-generated
constructor
stub
mScroller
=
new
Scroller(context);
mCurScreen
=
mDefaultScreen;
mTouchSlop
=
ViewConfiguration.get(getContext()).getScaledTouchSlop();
}
@Override
protected
void
onLayout(boolean
changed,
int
l,
int
t,
int
r,
int
b)
{
//
TODO
Auto-generated
method
stub
int
childLeft
=
0;
final
int
childCount
=
getChildCount();
System.out.println("childCount="
+
childCount);
for
(int
i
=
0;
i
<
childCount;
i++)
{
final
View
childView
=
getChildAt(i);
if
(childView.getVisibility()
!=
View.GONE)
{
final
int
childWidth
=
childView.getMeasuredWidth();
childView.layout(childLeft,
0,
childLeft
+
childWidth,
childView.getMeasuredHeight());
childLeft
+=
childWidth;
}
}
}
@Override
protected
void
onMeasure(int
widthMeasureSpec,
int
heightMeasureSpec)
{
Log.e(TAG,
"onMeasure");
super.onMeasure(widthMeasureSpec,
heightMeasureSpec);
final
int
width
=
MeasureSpec.getSize(widthMeasureSpec);
final
int
widthMode
=
MeasureSpec.getMode(widthMeasureSpec);
if
(widthMode
!=
MeasureSpec.EXACTLY)
{
throw
new
IllegalStateException(
"ScrollLayout
only
canmCurScreen
run
at
EXACTLY
mode!");
}
final
int
heightMode
=
MeasureSpec.getMode(heightMeasureSpec);
if
(heightMode
!=
MeasureSpec.EXACTLY)
{
throw
new
IllegalStateException(
"ScrollLayout
only
can
run
at
EXACTLY
mode!");
}
//
The
children
are
given
the
same
width
and
height
as
the
scrollLayout
final
int
count
=
getChildCount();
for
(int
i
=
0;
i
<
count;
i++)
{
getChildAt(i).measure(widthMeasureSpec,
heightMeasureSpec);
}
System.out.println("moving
to
screen
"
+
mCurScreen);
scrollTo(mCurScreen
*
width,
0);
}
/**
*
According
to
the
position
of
current
layout
scroll
to
the
destination
*
page.
*/
public
void
snapToDestination()
{
final
int
screenWidth
=
getWidth();
final
int
destScreen
=
(getScrollX()
+
screenWidth
/
2)
/
screenWidth;
snapToScreen(destScreen);
}
public
void
snapToScreen(int
whichScreen)
{
//
get
the
valid
layout
page
whichScreen
=
Math.max(0,
Math.min(whichScreen,
getChildCount()
-
1));
if
(getScrollX()
!=
(whichScreen
*
getWidth()))
{
final
int
delta
=
whichScreen
*
getWidth()
-
getScrollX();
mScroller.startScroll(getScrollX(),
0,
delta,
0,
Math.abs(delta)
*
2);
mCurScreen
=
whichScreen;
invalidate();
//
Redraw
the
layout
}
}
public
void
setToScreen(int
whichScreen)
{
whichScreen
=
Math.max(0,
Math.min(whichScreen,
getChildCount()
-
1));
mCurScreen
=
whichScreen;
scrollTo(whichScreen
*
getWidth(),
0);
}
public
int
getCurScreen()
{
return
mCurScreen;
}
@Override
public
void
computeScroll()
{
//
TODO
Auto-generated
method
stub
if
(mSputeScrollOffset())
{
scrollTo(mScroller.getCurrX(),
mScroller.getCurrY());
postInvalidate();
}
}
@Override
public
boolean
onTouchEvent(MotionEvent
event)
{
//
TODO
Auto-generated
method
stub
if
(mVelocityTracker
==
null)
{
mVelocityTracker
=
VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
final
int
action
=
event.getAction();
final
float
x
=
event.getX();
final
float
y
=
event.getY();
switch
(action)
{
case
MotionEvent.ACTION_DOWN:
Log.e(TAG,
"event
down!");
if
(!mScroller.isFinished())
{
mScroller.abortAnimation();
}
mLastMotionX
=
x;
break;
case
MotionEvent.ACTION_MOVE:
int
deltaX
=
(int)
(mLastMotionX
-
x);
mLastMotionX
=
x;
scrollBy(deltaX,
0);
break;
case
MotionEvent.ACTION_UP:
Log.e(TAG,
"event
:
up");
//
if
(mTouchState
==
TOUCH_STATE_SCROLLING)
{
final
VelocityTracker
velocityTracker
=
mVelocityTracker;
velocityTputeCurrentVelocity(1000);
int
velocityX
=
(int)
velocityTracker.getXVelocity();
Log.e(TAG,
"velocityX:"
+
velocityX);
if
(velocityX
>
SNAP_VELOCITY
&&
mCurScreen
>
0)
{
//
Fling
enough
to
move
left
Log.e(TAG,
"snap
left");
onScreenChangeListener.onScreenChange(mCurScreen
-
1);
System.out.println("mCurScreen="
+
(mCurScreen
-
1));
snapToScreen(mCurScreen
-
1);
}
else
if
(velocityX
<
-SNAP_VELOCITY
&&
mCurScreen
<
getChildCount()
-
1)
{
//
Fling
enough
to
move
right
Log.e(TAG,
"snap
right");
onScreenChangeListener.onScreenChange(mCurScreen
+
1);
//只往右移動(dòng)才加載數(shù)據(jù)
onScreenChangeListenerDataLoad.onScreenChange(mCurScreen+1);
snapToScreen(mCurScreen
+
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;
}
@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:
final
int
xDiff
=
(int)
Math.abs(mLastMotionX
-
x);
if
(xDiff
>
mTouchSlop)
{
mTouchState
=
TOUCH_STATE_SCROLLING;
}
break;
case
MotionEvent.ACTION_DOWN:
mLastMotionX
=
x;
mLastMotionY
=
y;
mTouchState
=
mScroller.isFinished()
?
TOUCH_STATE_REST
:
TOUCH_STATE_SCROLLING;
break;
case
MotionEvent.ACTION_CANCEL:
case
MotionEvent.ACTION_UP:
mTouchState
=
TOUCH_STATE_REST;
break;
}
return
mTouchState
!=
TOUCH_STATE_REST;
}
//分頁(yè)監(jiān)聽
public
interface
OnScreenChangeListener
{
void
onScreenChange(int
currentIndex);
}
private
OnScreenChangeListener
onScreenChangeListener;
public
void
setOnScreenChangeListener(
OnScreenChangeListener
onScreenChangeListener)
{
this.onScreenChangeListener
=
onScreenChangeListener;
}
//動(dòng)態(tài)數(shù)據(jù)監(jiān)聽
public
interface
OnScreenChangeListenerDataLoad
{
void
onScreenChange(int
currentIndex);
}
private
OnScreenChangeListenerDataLoad
onScreenChangeListenerDataLoad;
public
void
setOnScreenChangeListenerDataLoad(OnScreenChangeListenerDataLoad
onScreenChangeListenerDataLoad)
{
this.onScreenChangeListenerDataLoad
=
onScreenChangeListenerDataLoad;
}
}Java代碼package
cn.anycall.ju;
import
android.content.Context;
import
android.graphics.Canvas;
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.Scroller;
/**
*
仿Launcher中的WorkSapce,可以左右滑動(dòng)切換屏幕的類
*
*/
public
class
ScrollLayout
extends
ViewGroup
{
private
static
final
String
TAG
=
"ScrollLayout";
private
Scroller
mScroller;
private
VelocityTracker
mVelocityTracker;
private
int
mCurScreen;
private
int
mDefaultScreen
=
0;
private
static
final
int
TOUCH_STATE_REST
=
0;
private
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥物輔料晶體篩選-洞察分析
- 行業(yè)競(jìng)爭(zhēng)態(tài)勢(shì)評(píng)估-洞察分析
- 2025年滬教版七年級(jí)化學(xué)下冊(cè)階段測(cè)試試卷含答案
- 2025年人教版PEP九年級(jí)地理下冊(cè)月考試卷含答案
- 遠(yuǎn)程會(huì)診系統(tǒng)的質(zhì)量評(píng)價(jià)體系-洞察分析
- 2025年人教B版九年級(jí)地理下冊(cè)階段測(cè)試試卷
- 2025版路燈照明設(shè)施項(xiàng)目風(fēng)險(xiǎn)評(píng)估合同范本4篇
- 2025年外研版2024九年級(jí)化學(xué)下冊(cè)月考試卷含答案
- 2025年浙教版九年級(jí)科學(xué)下冊(cè)階段測(cè)試試卷含答案
- 2025年人教版(2024)七年級(jí)生物下冊(cè)階段測(cè)試試卷含答案
- 春節(jié)英語(yǔ)介紹SpringFestival(課件)新思維小學(xué)英語(yǔ)5A
- 進(jìn)度控制流程圖
- 2023年江蘇省南京市中考化學(xué)真題
- 【閱讀提升】部編版語(yǔ)文五年級(jí)下冊(cè)第四單元閱讀要素解析 類文閱讀課外閱讀過(guò)關(guān)(含答案)
- 供電副所長(zhǎng)述職報(bào)告
- 現(xiàn)在完成時(shí)練習(xí)(短暫性動(dòng)詞與延續(xù)性動(dòng)詞的轉(zhuǎn)換)
- 產(chǎn)品質(zhì)量監(jiān)控方案
- 物業(yè)總經(jīng)理述職報(bào)告
- 新起點(diǎn),新發(fā)展心得體會(huì)
- 深圳大學(xué)學(xué)校簡(jiǎn)介課件
- 校園欺凌問(wèn)題成因及對(duì)策分析研究論文
評(píng)論
0/150
提交評(píng)論