当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]最近折腾了很久,经过三番五次的推倒重来,总算是弄出了一个效果比较满意的侧滑demo。把主要的实现流程mark下来,方便日后翻阅,实现的效果图(手动录制的,不流畅): 从图

最近折腾了很久,经过三番五次的推倒重来,总算是弄出了一个效果比较满意的侧滑demo。把主要的实现流程mark下来,方便日后翻阅,实现的效果图(手动录制的,不流畅):

 

 

从图上可以看到,demo上面有三个按钮和一个包含3个Fragment页面的ViewPager,另外左侧滑能拉出一个左页面。刚开始做的demo是直接用FragmentTabHost来实现的,并在这个基础上继承RelativeLayout写了个布局,来实现页面的侧滑效果。那个demo的效果跟这个的主要差距就是三个tab之间只能通过点击切换,没有viewpager这样的滑动切换效果。这个demo下面的三个按钮其实是三个RadioButton,只是把它前面的圆点隐藏了(demo里面没好好弄按钮上的背景效果了)。之前尝试过利用PagerTitleStrip来实现三个Tab的标签,但结果是它们会随着ViewPager不停滚动,没法固定下来。

demo主要的布局文件如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent" >

 

android:id="@+id/pager"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_above="@+id/titlelayout" >

 

 

android:id="@+id/titlelayout"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true" >

 

android:id="@+id/tab_menu"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:background="@drawable/tab_bg_normal"

android:orientation="horizontal" >

 

android:id="@+id/title1"

style="@style/tab_style"

android:checked="true"

android:drawableTop="@drawable/tab_activity_selector"

android:text="活动" />

 

android:id="@+id/title2"

style="@style/tab_style"

android:drawableTop="@drawable/tab_friend"

android:text="工作" />

 

android:id="@+id/title3"

style="@style/tab_style"

android:drawableTop="@drawable/tab_friend"

android:text="圈子" />

 

 

 

要实现ViewPager+Fragment的滑动效果,必须继承FragmentActivity,同时要给ViewPager设置Adapter。由于ViewPager上面要加载Fragment(需要继承Fragment类),所以不是重载PagerAdapter,而是重写FragmentPagerAdapter类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

public class MyViewPagerAdapter extends FragmentPagerAdapter {

private ArrayList fragments;//需要添加到上面的Fragment

public MyViewPagerAdapter(FragmentManager fm) {

super(fm);

}

/**

* 自定义的构造函数

* @param fm

* @param fragments ArrayList

*/

public MyViewPagerAdapter(FragmentManager fm,ArrayList fragments) {

super(fm);

this.fragments = fragments;

}

@Override

public Fragment getItem(int arg0) {

return fragments.get(arg0);//返回Fragment对象

}

@Override

public int getCount() {

return fragments.size();//返回Fragment的个数

}

}

写好了adapter,在主函数的onCreate()函数里面初始化ViewPager,同时给它配置adapter和设置滑动事件监听(这需要实现OnPageChangeListener接口):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

/**

* 初始化视图

*/

private void initView() {

// TODO Auto-generated method stub[!--empirenews.page--]

pager=(ViewPager) findViewById(R.id.pager);//初始化控件

fragments=new ArrayList();//初始化数据

fragments.add(new ActivityFragment());

fragments.add(new JobFragment());

fragments.add(new FriendFragment());

}

/**

* 初始化ViewPager

*/

private void initViewPager() {

// TODO Auto-generated method stub

mAdapter=new MyViewPagerAdapter(getSupportFragmentManager(), fragments);

pager.setAdapter(mAdapter);

pager.setOnPageChangeListener(this);

pager.setCurrentItem(0);//设置成当前第一个

}

/**

* OnPageChangeListener的接口函数

*/

@Override

public void onPageSelected(int arg0) {

title.get(arg0).setChecked(true);//保持页面跟按钮的联动

//下面这个条件语句里面的是针对侧滑效果的

if(arg0==0){

// 如果当前是第一页,那么设置触摸屏幕的模式为全屏模式

sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//设置成全屏响应

}else {

// 如果不是第一页,设置触摸屏幕的模式为边缘60px的地方

sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);

}

}

以上基本配置好了ViewPager组件,运行起来3个Fragment页面可以自由滑动了,但是下面的三个button还没有设置监听,所以viewpager切换的时候不会跟着切换,点击也不会有响应。接下来要做的就是在onCreate()里面初始化RadioButton,并给它设置OnClickListener监听点击事件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

/**

* 初始化几个用来显示title的RadioButton

*/

private void initTitle() {

title.add((RadioButton) findViewById(R.id.title1));//三个title标签

title.add((RadioButton) findViewById(R.id.title2));

title.add((RadioButton) findViewById(R.id.title3));

title.get(0).setOnClickListener(new MyOnClickListener(0));//设置响应

title.get(1).setOnClickListener(new MyOnClickListener(1));

title.get(2).setOnClickListener(new MyOnClickListener(2));

}

/**

* 重写OnClickListener的响应函数,主要目的就是实现点击title时,pager会跟着响应切换

* @author llb

*/

private class MyOnClickListener implements OnClickListener{

private int index;

public MyOnClickListener(int index){

this.index=index;

}

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

pager.setCurrentItem(index);//把viewpager的视图切过去,实现title跟pager的联动

title.get(index).setChecked(true);//设置被选中,否则布局里面的背景不会切换

}

}

最后就是实现侧滑出左边页面的效果,这里使用了开源组件SlidingMenu,具体的使用方法可百度or查看源代码。SlidingMenu组件重写了Activity、FragmentActivity、RelativeLayout等,要实现侧滑效果,可以把主函数继承的FragmentActivity改成SlidingFragmentActivity,也可以去在xml布局文件里面直接设置。这个demo里面采用的是继承SlidingFragmentActivity类,主要的初始化代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

/**

* 初始化开源组件SlidingMenu

*/

private void initSlidingMenu() {

// 实例化滑动菜单对象

SlidingMenu sm = getSlidingMenu();

setContentView(R.layout.activity_main);//设置当前的视图

setBehindContentView(R.layout.left);//设置左页视图

sm.setMode(SlidingMenu.LEFT);

// 设置滑动阴影的宽度

// sm.setShadowWidthRes(R.dimen.shadow_width);

// 设置滑动阴影的图像资源

// sm.setShadowDrawable(R.drawable.shadow);

// 设置滑动菜单视图的宽度

// sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);

// 设置渐入渐出效果的值

sm.setFadeDegree(0.35f);

// 设置触摸屏幕的模式

sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);

// sm.setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN);//设置左页的响应范围

sm.setTouchmodeMarginThreshold(60);//这个设置的是隔屏幕边缘多远开始响应

// sm.setBehindOffset(50);//设置左页距离屏幕右边缘的距离,右页会补上

WindowManager wManager=(WindowManager) getSystemService(Context.WINDOW_SERVICE);

screenWidth=wManager.getDefaultDisplay().getWidth();//获取屏幕的宽度

sm.setBehindWidth((int) (screenWidth*0.8));//设置左页的宽度

}

最后附上其中一个Fragment的示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18[!--empirenews.page--]

19

20

public class ActivityFragment extends Fragment{

private View view;//缓存页面

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

}

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

if(view==null){

view=inflater.inflate(R.layout.activity_fragment,container, false);

}

ViewGroup parent = (ViewGroup) view.getParent();

if(parent!=null){

parent.removeView(view);//先移除

}

return view;

}

}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭