HorizontalScrollView实现多页左右滑动
2015-11-11 15:22
651 查看
先上图看看效果:
上代码:
PageView是封装后的一个类,继承了HorizontalScrollView。
[java] view
plaincopy
package com.miquan;
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
/**
* 具体看博客:http://blog.csdn.net/qiantujava/article/details/42392127
*/
public class PageView extends HorizontalScrollView {
private int mBaseScrollX;//滑动基线。也就是点击并滑动之前的x值,以此值计算相对滑动距离。
private int mScreenWidth;
private int mScreenHeight;
private LinearLayout mContainer;
private boolean flag;
private int mPageCount;//页面数量
private int mScrollX = 200;//滑动多长距离翻页
public PageView(Context context, AttributeSet attrs) {
super(context, attrs);
DisplayMetrics dm = context.getApplicationContext().getResources()
.getDisplayMetrics();
mScreenWidth = dm.widthPixels;
mScreenHeight = dm.heightPixels;
}
/**
* 添加一个页面到最后。
* @param page
*/
public void addPage(View page) {
addPage(page, -1);
}
/**
* 添加一个页面。
* @param page
*/
public void addPage(View page, int index) {
if(!flag) {
mContainer = (LinearLayout) getChildAt(0);
flag = true;
}
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mScreenWidth, mScreenHeight);
if(index == -1) {
mContainer.addView(page, params);
} else {
mContainer.addView(page, index, params);
}
mPageCount++;
}
/**
* 移除一个页面。
* @param index
*/
public void removePage(int index) {
if(mPageCount < 1) {
return;
}
if(index<0 || index>mPageCount-1) {
return;
}
mContainer.removeViewAt(index);
mPageCount--;
}
/**
* 移除所有的页面
*/
public void removeAllPages() {
if(mPageCount > 0) {
mContainer.removeAllViews();
}
}
/**
* 获取页面数量
* @return
*/
public int getPageCount() {
return mPageCount;
}
/**
* 获取相对滑动位置。由右向左滑动,返回正值;由左向右滑动,返回负值。
* @return
*/
private int getBaseScrollX() {
return getScrollX() - mBaseScrollX;
}
/**
* 使相对于基线移动x距离。
* @param x x为正值时右移;为负值时左移。
*/
private void baseSmoothScrollTo(int x) {
smoothScrollTo(x + mBaseScrollX, 0);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_UP:
int scrollX = getBaseScrollX();
//左滑,大于一半,移到下一页
if (scrollX > mScrollX) {
baseSmoothScrollTo(mScreenWidth);
mBaseScrollX += mScreenWidth;
}
//左滑,不到一半,返回原位
else if (scrollX > 0) {
baseSmoothScrollTo(0);
}
//右滑,不到一半,返回原位
else if(scrollX > -mScrollX) {
baseSmoothScrollTo(0);
}
//右滑,大于一半,移到下一页
else {
baseSmoothScrollTo(-mScreenWidth);
mBaseScrollX -= mScreenWidth;
}
return true;
}
return super.onTouchEvent(ev);
}
}
接下来是布局,fragment_main.xml:
[html] view
plaincopy
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- pageview里面必须有LinearLayout,这个写死了。 -->
<com.example.testandrid.PageView
android:id="@+id/pageview"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:scrollbars="none" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal" >
</LinearLayout>
</com.example.testandrid.PageView>
</LinearLayout>
最后在Activity里面调用就行。
[java] view
plaincopy
package com.example.testandrid;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
public class MainActivity extends Activity {
private LayoutInflater inflater;
private PageView mPageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
inflater = LayoutInflater.from(this);
mPageView = (PageView) findViewById(R.id.pageview);
//增加几个页面
LinearLayout layout = new LinearLayout(this);
layout.setBackgroundColor(Color.BLUE);
mPageView.addPage(layout);
LinearLayout layout2 = new LinearLayout(this);
layout2.setBackgroundColor(Color.YELLOW);
mPageView.addPage(layout2);
//这里就是个普通的xml布局文件
LinearLayout view = (LinearLayout) inflater.inflate(R.layout.page1, null);
mPageView.addPage(view);
//删除一个页面
// mPageView.removePage(1);
}
}
上代码:
PageView是封装后的一个类,继承了HorizontalScrollView。
[java] view
plaincopy
package com.miquan;
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
/**
* 具体看博客:http://blog.csdn.net/qiantujava/article/details/42392127
*/
public class PageView extends HorizontalScrollView {
private int mBaseScrollX;//滑动基线。也就是点击并滑动之前的x值,以此值计算相对滑动距离。
private int mScreenWidth;
private int mScreenHeight;
private LinearLayout mContainer;
private boolean flag;
private int mPageCount;//页面数量
private int mScrollX = 200;//滑动多长距离翻页
public PageView(Context context, AttributeSet attrs) {
super(context, attrs);
DisplayMetrics dm = context.getApplicationContext().getResources()
.getDisplayMetrics();
mScreenWidth = dm.widthPixels;
mScreenHeight = dm.heightPixels;
}
/**
* 添加一个页面到最后。
* @param page
*/
public void addPage(View page) {
addPage(page, -1);
}
/**
* 添加一个页面。
* @param page
*/
public void addPage(View page, int index) {
if(!flag) {
mContainer = (LinearLayout) getChildAt(0);
flag = true;
}
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mScreenWidth, mScreenHeight);
if(index == -1) {
mContainer.addView(page, params);
} else {
mContainer.addView(page, index, params);
}
mPageCount++;
}
/**
* 移除一个页面。
* @param index
*/
public void removePage(int index) {
if(mPageCount < 1) {
return;
}
if(index<0 || index>mPageCount-1) {
return;
}
mContainer.removeViewAt(index);
mPageCount--;
}
/**
* 移除所有的页面
*/
public void removeAllPages() {
if(mPageCount > 0) {
mContainer.removeAllViews();
}
}
/**
* 获取页面数量
* @return
*/
public int getPageCount() {
return mPageCount;
}
/**
* 获取相对滑动位置。由右向左滑动,返回正值;由左向右滑动,返回负值。
* @return
*/
private int getBaseScrollX() {
return getScrollX() - mBaseScrollX;
}
/**
* 使相对于基线移动x距离。
* @param x x为正值时右移;为负值时左移。
*/
private void baseSmoothScrollTo(int x) {
smoothScrollTo(x + mBaseScrollX, 0);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_UP:
int scrollX = getBaseScrollX();
//左滑,大于一半,移到下一页
if (scrollX > mScrollX) {
baseSmoothScrollTo(mScreenWidth);
mBaseScrollX += mScreenWidth;
}
//左滑,不到一半,返回原位
else if (scrollX > 0) {
baseSmoothScrollTo(0);
}
//右滑,不到一半,返回原位
else if(scrollX > -mScrollX) {
baseSmoothScrollTo(0);
}
//右滑,大于一半,移到下一页
else {
baseSmoothScrollTo(-mScreenWidth);
mBaseScrollX -= mScreenWidth;
}
return true;
}
return super.onTouchEvent(ev);
}
}
接下来是布局,fragment_main.xml:
[html] view
plaincopy
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- pageview里面必须有LinearLayout,这个写死了。 -->
<com.example.testandrid.PageView
android:id="@+id/pageview"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:scrollbars="none" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal" >
</LinearLayout>
</com.example.testandrid.PageView>
</LinearLayout>
最后在Activity里面调用就行。
[java] view
plaincopy
package com.example.testandrid;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
public class MainActivity extends Activity {
private LayoutInflater inflater;
private PageView mPageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
inflater = LayoutInflater.from(this);
mPageView = (PageView) findViewById(R.id.pageview);
//增加几个页面
LinearLayout layout = new LinearLayout(this);
layout.setBackgroundColor(Color.BLUE);
mPageView.addPage(layout);
LinearLayout layout2 = new LinearLayout(this);
layout2.setBackgroundColor(Color.YELLOW);
mPageView.addPage(layout2);
//这里就是个普通的xml布局文件
LinearLayout view = (LinearLayout) inflater.inflate(R.layout.page1, null);
mPageView.addPage(view);
//删除一个页面
// mPageView.removePage(1);
}
}
相关文章推荐
- 使用HorizontalScrollView和ImageView编写简单的图片展示程序
- ScrollView和HorizontalScrollView的用法
- HorizontalScrollView+viewpager实现仿天天动听ios版和QQ侧边菜单效果
- android仿网易导航栏HorizontalScrollView
- [Android] 快速实现一个可切换Tab标签页的组件
- Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果
- Android HorizontalScrollView结合GridView实现类似网易新闻那样的栏目滑动效果
- HorizontalScrollView 替换 过期Gallery 的实用demo
- Horizontal+ViewPager
- Gallery is deprecated:Gallery 过期了怎么办?(一)
- HorizontalScrollView实现画廊
- 基于HorizontalScrollView的anroid侧滑栏的实现
- 利用HorizontalScrollView加Viewpager实现多个的导航标题栏
- 安卓侧滑菜单制作
- [Android] 带阻尼效果的可拉伸的HorizontalScrollView
- Android 高仿 QQ5.0 侧滑菜单效果 HorizontalScrollView
- ViewPager + HorizontalScrollView 实现可滚动的标签栏
- 【FastDev4Android框架开发】HorizontalScrollView,Fragment,FragmentStatePagerAdapter打造网易新闻Tab及滑动页面效果(三十六)
- 使用HorizontalScrollView实现最简单的侧滑菜单