ViewPager 滑动页(一)
需求:滑动展示页,能够使用本地数据,及获取服务器数据进行刷新操作;
效果图:

实现分析:
1.目录结构:


代码实现:
1.fragment_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.jjc.demo.MainActivity$PlaceholderFragment" > <com.jjc.demo.PosterView
android:id="@+id/poster"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </RelativeLayout>
2.view_poster.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" > <android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <LinearLayout
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:gravity="center"
android:background="@android:color/transparent"
android:orientation="horizontal" /> </FrameLayout>
3.item_poster.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <ImageView
android:id="@+id/image_pic"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop" /> </FrameLayout>
4.poster_point_selector.xml
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="true"><bitmap android:src="@drawable/point_normal" />
</item>
<item android:state_enabled="false"><bitmap android:src="@drawable/point_select" />
</item> </selector>
5.PosterView.java
package com.jjc.demo; import java.util.ArrayList;
import java.util.List; import android.content.Context;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout; public class PosterView extends FrameLayout{ private Context context;
private ViewPager viewPager;
private LinearLayout container; private PosterAdapter adapter; private List<Integer> posterList = new ArrayList<Integer>(); private ImageView imageView;
// 底部小点的图片
private ImageView[] points; // 记录当前选中位置
private int currentIndex = 0;
// private int nextIndex;
private int pageNum = 1; public PosterView(Context context) {
this(context, null);
} public PosterView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
LayoutInflater.from(context).inflate(R.layout.view_poster, this, true);
initView();
} private void initView(){
container = (LinearLayout) findViewById(R.id.container);
viewPager = (ViewPager)findViewById(R.id.viewpager);
viewPager.setOnPageChangeListener(new viewpagerListener()); adapter = new PosterAdapter(context, posterList);
viewPager.setAdapter(adapter);
} /**
* 刷新海报页数据;
* @param list
*/
public void refreshData(List<Integer> list){
if(list == null || list.isEmpty()){
return;
}
initPoint(list.size()); posterList.clear();
posterList.addAll(list);
adapter.notifyDataSetChanged();
} private void initPoint(int num){
pageNum = num;
container.removeAllViews(); if(num == 0){
return;
} points = new ImageView[num];
for (int i = 0; i < num; i++) {
imageView = new ImageView(context);
imageView.setBackgroundResource(R.drawable.poster_point_selector); LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(12, 12);
mLayoutParams.rightMargin = 8;
mLayoutParams.leftMargin = 8;
mLayoutParams.topMargin = 24;
mLayoutParams.bottomMargin = 28; points[i] = imageView;
// 设置位置tag,方便取出与当前位置对应
points[i].setTag(i);
// 默认都设为灰色
points[i].setEnabled(false);
// 给每个小点设置监听
points[i].setOnClickListener(new pointListener());
container.addView(points[i], mLayoutParams);
}
// 设置为白色,即选中状态
points[currentIndex].setEnabled(true);
} private class viewpagerListener implements OnPageChangeListener { @Override
public void onPageScrollStateChanged(int arg0) {
} @Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
} @Override
public void onPageSelected(int position) {
// 设置底部小点选中状态
setCurDot(position);
}
} private class pointListener implements OnClickListener { @Override
public void onClick(View v) {
int position = (Integer) v.getTag();
setCurView(position);
setCurDot(position);
}
} /**
* 设置当前页面的位置
*/
private void setCurView(int position) {
if (position < 0 || position >= pageNum) {
return;
}
viewPager.setCurrentItem(position);
} /**
* 设置当前的小点的位置
*/
private void setCurDot(int positon) {
if (positon < 0 || positon > pageNum - 1 || currentIndex == positon) {
return;
}
points[positon].setEnabled(true);
points[currentIndex].setEnabled(false);
currentIndex = positon;
} }
6.PosterAdapter.java
package com.jjc.demo; import java.util.List; import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView; public class PosterAdapter extends PagerAdapter { // private Context context;
private List<Integer> posterList; private LayoutInflater inflater; public PosterAdapter(Context context, List<Integer> posterList) {
// this.context = context;
this.posterList = posterList;
inflater = LayoutInflater.from(context);
} @Override
public int getCount() {
return posterList.isEmpty() ? 0 : posterList.size();
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
} @Override
public Object instantiateItem(ViewGroup container, int position) { View view = container.findViewById(position);
ViewHolder holder; if(view == null){
holder = new ViewHolder();
view = inflater.inflate(R.layout.item_poster, null);
//为View设置标识符,可通过findViewById方法获取
view.setId(position);
holder.icon = (ImageView)view.findViewById(R.id.image_pic);
container.addView(view);
view.setTag(holder);
}else{
holder = (ViewHolder)view.getTag();
}
holder.icon.setImageResource(posterList.get(position)); return view;
} static class ViewHolder{
ImageView icon;
}
}
7.MainActivity.java
package com.jjc.demo; import java.util.ArrayList;
import java.util.List; import android.support.v7.app.ActionBarActivity;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class MainActivity extends ActionBarActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
} /**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment { private View rootView;
private PosterView posterView; public PlaceholderFragment() {
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initView();
} private void initView() {
posterView = (PosterView)rootView.findViewById(R.id.poster); // posterView.setBackgroundResource(R.drawable.poster_02);
List<Integer> images = new ArrayList<Integer>();
images.add(R.drawable.poster_01);
images.add(R.drawable.poster_02);
images.add(R.drawable.poster_03);
images.add(R.drawable.poster_04);
images.add(R.drawable.poster_05);
posterView.refreshData(images); }
} }
代码:http://pan.baidu.com/s/1mgHWqrY
ViewPager 滑动页(一)的更多相关文章
- ViewPager 滑动页(四)
需求:在ViewPager 滑动页(三) 基础上,减少界面层级. 效果图: 图层数变更前: 图层数变更后: 主要代码实现: <?xml version="1.0" encod ...
- ViewPager 滑动页(三)
需求:滑动展示页,能够使用本地数据,及获取服务器数据进行刷新操作,当滑动到最后一页时,结束当前activity,进入下一个activity: 效果图: 实现分析: 1.目录结构: 代码实现: 1.Po ...
- ViewPager 滑动页(二)
需求:滑动展示页,能够使用本地数据,及获取服务器数据进行刷新操作,并实现页面自动切换: 效果图: 实现分析: 1.目录结构: 代码实现: 1.PosterView.java package com.j ...
- 【解决ViewPager在大屏上滑动不流畅】 设置ViewPager滑动翻页距离
在项目中做了一个ViewPager+Fragment滑动翻页的效果,在模拟器和小米手机上测试也比较正常.但是换到4.7以上屏幕测试的时候发现老是滑动失效. 因为系统默认的滑动策略是当用户滑动超过半屏之 ...
- (转)ViewPager,ScrollView 嵌套ViewPager滑动冲突解决
ViewPager,ScrollView 嵌套ViewPager滑动冲突解决 本篇主要讲解一下几个问题 粗略地介绍一下View的事件分发机制 解决事件滑动冲突的思路及方法 ScrollView 里面嵌 ...
- ViewPager实现页卡的最新方法--简洁的TabLayout(谷歌支持包)
效果图: 添加依赖包: compile ‘com.android.support:design:‘ 布局文件: <?xml version="1.0" encoding=&q ...
- android开发学习之ViewPager滑动事件讲解
android ViewPager滑动事件讲解 今天在做项目的时候,由于要处理viewPager页面滑动的事件,所以对其进行了一个小小的研究: 首先ViewPager在处理滑动事件的时候要用到OnPa ...
- 如何禁止内部viewPager滑动
众所周知,viewPager是能够滑动的,但有时候我们需要禁止它的滑动(微笑地面对*----*). 情况是这样的: activity中有一个viewPager,viewPager中加入3个Fragme ...
- ViewPager实现页卡的3种方法(谷歌组件)
----方法一:---- 效果图: 须要的组件: ViewPager+PagerTabStrip 布局文件代码: <!--xmlns:android_custom="http://sc ...
随机推荐
- oracle闪回表详解
--- 说明闪回数据库 --- 使用闪回表将表内容还原到过去的特定时间点 --- 从删除表中进行恢复 --- 使用闪回查询查看截止到任一时间点的数据库内容 --- 使用闪回版本查询查看某一行在一段时间 ...
- 百度地图 获取矩形point
http://developer.baidu.com/map/jsdemo.htm#f0_7 鼠标绘制点线面 <!DOCTYPE html><html><head> ...
- 关于count(1) 和 count(*)
Q:What is the difference between count(1) and count(*) in a sql queryeg.select count(1) from emp; an ...
- WPF常用数据绑定控件集合
1.怎么用ListView控件把XML中的数据在界面上显示出来? <?xml version="1.0" encoding="utf-8" ?> & ...
- (转载)Cocos2dx-OpenGL ES2.0教程:初识MVP(3)
在上一篇文章中,我在介绍vertex shader的时候挖了一个坑:CC_MVPMatrix.它其实是一个uniform,每一个cocos2d-x预定义的shader都包含有这个uniform, 但是 ...
- [SQL SERVER系列]读书笔记之SQL注入漏洞和SQL调优
最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“'1'='1'”这个表达式永远返回 true, ...
- swift基础--运算符
(1)加减乘除 (2)三目运算,切记后面的空格如果不加会报错的.估计是苹果的bug. (3)聚合运算符,省却了一个判断,很人性化 (4)区间运算符 //加减乘除等等 let a = 2 let b = ...
- 相似元素存在的意义---HTML&CSS
1.<q> 效果: 告诉浏览器这是一段短引用,让浏览器以合适的方法来显示 注: 不能直接以双引号直接代替<q>,因为有些浏览器<q>的效果不是双引号. 不要忘了移动 ...
- svn is already locked解决方案
在出错文件夹下,鼠标右键TortoiseSVN->Clean up. SVN错误:Attempted to lock an already-locked dir 1.出现这个问题后使用“清理”功 ...
- ExtJS4.2学习(20)动态数据表格之前几章总结篇1(转)
鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2014-02-18/196.html --------------- ...