android 十字架效果实现(水平和垂直滑动)

本文介绍如何实现一个十字架效果,允许用户通过水平和垂直滑动选择子项。作者首先尝试使用Gallery,但发现Gallery无法垂直滑动,于是决定自己编写。经过两天的努力,成功实现了该功能。关键类包括HVScrollbar和HVFrameLayout,分别处理子项布局和滑动控制。代码中存在滑动处理的不足,但已实现预期效果,并提供了一个DEMO供交流。
摘要由CSDN通过智能技术生成

项目要求:一个十字架效果,水平和垂直滑动来选择每一子项。刚开始做的时候,以为很简单, 两个Gallery,一个水平,一个垂直放置就OK了,后来一看Gallery不能垂直滑动(网上貌似已经有了)。然后想为什么自己不能写一个了,花了两天功夫,终于做出效果来了,效果图如下:



1.代码目录结构


HVScrollbar.java:这个类负责承载每一个子项,其中有一个变量isVertical来判断水平或者垂直。

HVFrameLayout.java:这个类承载水平和垂直方向的滑动条,此类最关键的功能是控制滑动条的滑动,这点也是此功能的难点。

IconStyle.java:一个activity,不做介绍。

2.HVScrollbar.java

此类控制每一个子项的显示位置,并且显示水平或者垂直,在onMeasure和onLayout方法中控制。

@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		// TODO Auto-generated method stub
		FrameLayout.LayoutParams flp = (FrameLayout.LayoutParams)getLayoutParams();
		int count = getChildCount();
		for(int i = 0; i < count; i++)
		{
			View child = getChildAt(i);
			ViewGroup.LayoutParams vlp = child.getLayoutParams();
			if(vlp instanceof LayoutParams)
			{
				LayoutParams lp = (LayoutParams)vlp;
				child.layout(lp.x, lp.y, lp.x + lp.width, lp.y+lp.height);//根据LayoutParams来布局
			}
		}
	}
	
	

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// TODO Auto-generated method stub
		int count = getChildCount();
		int widthSpecSize = 0;
		int heightSpecSize = 0;
        for (int i = 0; i < count; i++) {
            View child = getChildAt(i);
            ViewGroup.LayoutParams vlp = child.getLayoutParams();
            if(vlp instanceof LayoutParams)
            {
            	LayoutParams lp = (LayoutParams)vlp;
            	if(isVertical)
            	{
            		//垂直方向设置子项的top和left
            		lp.x = 0;
            		lp.y = lp.height * i;
            		widthSpecSize = lp.width;
            		heightSpecSize +=lp.height;
            	}
            	else
            	{
            		//水平方向设置子项的top和left
            		lp.y = 0;
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值