android UI效果三: 滚动切换屏幕
来源:互联网 发布:小米5如何备份数据 编辑:程序博客网 时间:2024/06/05 23:44
效果如下:
主要有3个类1个layout:
Activity: ScrollViewTestActivity, 两个自定义View, 1个 ScrollView用来控制滑动效果, 1个PageControlView,用来控制下方显示的处在第几屏.
1个mian.xml
Activity:
import
android.app.Activity;
import
android.os.Bundle;
import
android.view.View;
import
android.widget.ImageView;
public
class
ScrollViewTestActivity
extends
Activity {
/** Called when the activity is first created. */
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
ScrollView sv = (ScrollView)findViewById(R.id.scroll);
ImageView iv =
new
ImageView(
this
);
iv.setImageDrawable(
this
.getResources().getDrawable(R.drawable.a1));
sv.addView(iv);
sv.addView(View.inflate(
this
, R.layout.layout_0,
null
));
ImageView iv2 =
new
ImageView(
this
);
iv2.setImageDrawable(getResources().getDrawable(R.drawable.a2));
sv.addView(iv2);
PageControlView pageControl = (PageControlView)findViewById(R.id.pageControl);
sv.setOnScreenChangeListener(pageControl);
sv.initPageControlView();
}
}
ScrollView:
import
android.content.Context;
import
android.util.AttributeSet;
import
android.view.GestureDetector;
import
android.view.GestureDetector.SimpleOnGestureListener;
import
android.view.MotionEvent;
import
android.view.View;
import
android.view.ViewConfiguration;
import
android.view.ViewGroup;
import
android.widget.Scroller;
public
class
ScrollView
extends
ViewGroup{
private
GestureDetector gesture;
private
Context context;
private
boolean
fling;
private
Scroller scroller;
private
OnScreenChangeListener onScreenChangeListener;
public
ScrollView(Context context) {
super
(context);
this
.context = context;
gesture =
new
GestureDetector(context,
new
GestureListener());
scroller =
new
Scroller(context);
}
public
ScrollView(Context context,AttributeSet att){
super
(context,att);
this
.context = context;
gesture =
new
GestureDetector(context,
new
GestureListener());
scroller =
new
Scroller(context);
}
@Override
protected
void
onLayout(
boolean
changed,
int
l,
int
t,
int
r,
int
b) {
for
(
int
i=
0
;i<getChildCount();i++){
View child = (View)getChildAt(i);
child.measure(r-l, b-t);
child.layout(getWidth()*i,
0
, getWidth()*(i+
1
), getHeight());
}
}
@Override
public
boolean
onTouchEvent(MotionEvent ev){
gesture.onTouchEvent(ev);
switch
(ev.getAction()){
case
MotionEvent.ACTION_MOVE:
break
;
case
MotionEvent.ACTION_UP:
System.out.println(
"action_up..."
);
if
(!fling){
scrollToScreen();
}
fling =
false
;
break
;
}
return
true
;
}
/**
* 用来计算拖动一段距离后,要显示哪个界面
*/
private
void
scrollToScreen(){
int
leftWidth = getScrollX();
int
tabs = leftWidth/getWidth();
int
len = leftWidth - tabs*getWidth();
if
(len<getWidth()/
2
){
// scrollTo(tabs*getWidth(),0);
scroller.startScroll(leftWidth,
0
, -len,
0
, len*
2
);
}
else
{
// scrollTo((tabs+1)*getWidth(),0);
scroller.startScroll(leftWidth,
0
, getWidth()-len,
0
, len*
2
);
tabs = tabs +
1
;
}
if
(onScreenChangeListener!=
null
){
onScreenChangeListener.screenChange(tabs, getChildCount());
}
invalidate();
}
@Override
public
void
computeScroll() {
if
(scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(),
0
);
postInvalidate();
}
}
class
GestureListener
extends
SimpleOnGestureListener{
@Override
public
boolean
onDoubleTap(MotionEvent e){
return
super
.onDoubleTap(e);
}
@Override
public
boolean
onDown(MotionEvent e){
return
super
.onDown(e);
}
@Override
public
boolean
onFling(MotionEvent e1, MotionEvent e2,
float
velocityX,
float
velocityY){
if
(Math.abs(velocityX)>ViewConfiguration.get(context).getScaledMinimumFlingVelocity()){
scrollToScreen();
fling =
true
;
}
return
true
;
}
@Override
public
void
onShowPress(MotionEvent e){
super
.onShowPress(e);
}
@Override
public
void
onLongPress(MotionEvent e){
super
.onLongPress(e);
}
@Override
public
boolean
onScroll(MotionEvent e1, MotionEvent e2,
float
distanceX,
float
distanceY){
if
(distanceX>
0
&&getScrollX()<(getChildCount()-
1
)*getWidth()||
distanceX<
0
&&getScrollX()>
0
){
scrollBy((
int
)distanceX,
0
);
}
return
true
;
}
@Override
public
boolean
onSingleTapUp(MotionEvent e){
return
super
.onSingleTapUp(e);
}
}
public
interface
OnScreenChangeListener {
void
screenChange(
int
currentTab,
int
totalTab);
}
public
void
setOnScreenChangeListener(OnScreenChangeListener onScreenChangeListener){
this
.onScreenChangeListener = onScreenChangeListener;
}
public
void
initPageControlView(){
if
(onScreenChangeListener!=
null
){
onScreenChangeListener.screenChange(
0
, getChildCount());
}
}
}
PageControlView:
import
com.yang.testscroll.ScrollView.OnScreenChangeListener;
import
android.content.Context;
import
android.util.AttributeSet;
import
android.widget.ImageView;
import
android.widget.LinearLayout;
public
class
PageControlView
extends
LinearLayout
implements
OnScreenChangeListener{
private
Context context;
public
PageControlView(Context context) {
super
(context);
this
.context = context;
}
public
PageControlView(Context context,AttributeSet attr){
super
(context,attr);
this
.context = context;
}
@Override
public
void
screenChange(
int
currentTab,
int
totalTab) {
this
.removeAllViews();
for
(
int
i=
0
;i<totalTab;i++){
ImageView iv =
new
ImageView(context);
if
(i==currentTab){
iv.setImageResource(R.drawable.page_indicator_focused);
}
else
{
iv.setImageResource(R.drawable.page_indicator);
}
this
.addView(iv);
}
}
}
main.xml:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <com.yang.testscroll.ScrollView android:id="@+id/scroll" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <com.yang.testscroll.PageControlView android:id="@+id/pageControl" android:layout_width="fill_parent" android:layout_height="40dp" android:layout_alignParentBottom="true" android:background="#8f00000f" android:gravity="center"/> </RelativeLayout>
http://www.cnblogs.com/yyyyy5101/archive/2012/01/12/2320587.html
- android UI效果三: 滚动切换屏幕
- 简单的屏幕滚动切换效果
- Android屏幕切换效果实现
- Android屏幕切换效果实现
- Android 屏幕切换效果实现 (转)
- Android 屏幕切换效果实现 (转)
- 屏幕滚动效果
- 文字滚动切换效果
- ui切换效果
- Android UI设计 屏幕底部的菜单栏 动画切换Activity
- Android UI基础之ViewFillper实现屏幕切换
- android 软键盘弹出,屏幕整体滚动到底部效果
- android图片左右滚动类似翻页切换幻灯片效果
- Android利用ViewFlipper实现屏幕切换动画效果
- Android利用ViewFlipper实现屏幕切换动画效果
- Android利用ViewFlipper实现屏幕切换动画效果
- Android利用ViewFlipper实现屏幕切换动画效果
- Android中利用ViewFliper实现屏幕切换效果
- gpio application
- sql2000 取表字段名,类型
- sed 命令
- jquery 遍历table
- Thread-Per-Message Pattern
- android UI效果三: 滚动切换屏幕
- WP开发的基础知识小结
- 关于功率计算单位
- u-boot启动过程分解 1
- android UI效果四: 动态填充Bitmap像素信息
- 编程之美-最短摘要
- Demo整理(一)----- 字体竖直排版的实现
- Java设计模式圣经连载(01)-简单工厂模式
- sql2000导出数据字典表(含字段名、格式、长度、备注等),可保存到excel