精华内容
下载资源
问答
  • ViewPager 嵌套多个Fragment,但是每个Fragment高度不一致,导致高度比较小的Fragment底部留有大片空白区域。 解决方法: 参考文章 关于ViewPager高度自适应(随着pager页的高度改变Viewpager的高度) ViewPager ...

    问题:
    ViewPager 嵌套多个Fragment,但是每个Fragment高度不一致,导致高度比较小的Fragment底部留有大片空白区域。
    解决方法:
    参考文章 关于ViewPager高度自适应(随着pager页的高度改变Viewpager的高度)
    ViewPager 常用重写类:
    1.viewpager嵌套在scrollview中,为了解决viewpager和scorllview的冲突,重写的类

    public class CustomViewPager extends ViewPager {  
    
        public CustomViewPager(Context context) {  
            super(context);  
        }  
    
        public CustomViewPager(Context context, AttributeSet attrs) {  
            super(context, attrs);  
        }  
    
        @Override  
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
    
            int height = 0;  
            for (int i = 0; i < getChildCount(); i++) {  
                View child = getChildAt(i);  
                child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));  
                int h = child.getMeasuredHeight();  
                if (h > height)  
                    height = h;  
            }  
    
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);  
    
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
        }  
    }  

    2.为了解决上述空白问题,首先定义一个CustomViewPager类,继承自ViewPager,重写onMeasure方法,重新计算高度

    public class CustomViewPager extends ViewPager
    {
        private int current;
        private int height = 0;
        /**
         * 保存position与对于的View
         */
        private HashMap<Integer, View> mChildrenViews = new LinkedHashMap<Integer, View>();
    
        private boolean scrollble = true;
    
        public CustomViewPager(Context context)
        {
            super(context);
        }
    
        public CustomViewPager(Context context, AttributeSet attrs)
        {
            super(context, attrs);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
        {
            if (mChildrenViews.size() > current) {
                View child = mChildrenViews.get(current);
                child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                height = child.getMeasuredHeight();
            }
    
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
    
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    
        public void resetHeight(int current) {
            this.current = current;
            if (mChildrenViews.size() > current) {
    
                LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
                if (layoutParams == null) {
                    layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height);
                } else {
                    layoutParams.height = height;
                }
                setLayoutParams(layoutParams);
            }
        }
        /**
         * 保存position与对于的View
         */
        public void setObjectForPosition(View view, int position)
        {
            mChildrenViews.put(position, view);
        }
    
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            if (!scrollble) {
                return true;
            }
            return super.onTouchEvent(ev);
        }
    
    
        public boolean isScrollble() {
            return scrollble;
        }
    
        public void setScrollble(boolean scrollble) {
            this.scrollble = scrollble;
        }
    }

    使用方法:
    首先在Fragment里调用setObjectForPosition方法,存放view和他对应的position:

       private int fragmentID=0;
    
        private  View rootView=null;
    
        public XXXXXFragment(CustomViewPager vp,int fragmentID)
        {
            this.vp = vp;
            this.fragmentID =fragmentID;
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            rootView = inflater.inflate(R.layout.fragment_chart_bp, container, false);
            ButterKnife.bind(this, rootView);
    
            vp.setObjectForPosition(rootView,fragmentID);
            return rootView;
        }

    如果从服务端获取数据,得到数据后,重新绘制Fragment,比如显示线形图,或者显示数据为空的提示之类的,需要在绘制之后,重新调用
    vp.setObjectForPosition(rootView,fragmentID);

    在设置ViewPager时,如果绘制有延迟,需要延迟调用viewPager.resetHeight(position);

      private LinkedHashMap<String, Fragment> titleFragmentMap = new LinkedHashMap<>();
        private Fragment fragment1, fragment2, fragment3;
    
    
             fragment1 = new XXXXXFragment(viewPager,0);
            fragment2 = new XXXXXFragment(viewPager,1);
            fragment3 = new XXXXXFragment(viewPager,2);
    
            titleFragmentMap.put("日", fragment1);
            titleFragmentMap.put("周", fragment2);
            titleFragmentMap.put("月", fragment3);
    
            pagerAdapter = new MyFragmentPageAdapter(getChildFragmentManager(), titleFragmentMap);
            viewPager.setAdapter(pagerAdapter);
    
            viewPager.setOffscreenPageLimit(3);
            viewPager.setCurrentItem(1);
    
            viewPager.addOnPageChangeListener(this);
    
            tabLayout.setupWithViewPager(viewPager);
            tabLayout.post(new Runnable()
            {
                @Override
                public void run()
                {
                    TabLayoutUtil.setUpIndicatorWidth(getContext(), tabLayout, 20, 20);
                    viewPager.resetHeight(1);
                }
            });
    
     @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
        {
        }
    
        @Override
        public void onPageSelected(int position)
        {
            viewPager.resetHeight(position);
    
            setInitLineChart();
        }
    
        @Override
        public void onPageScrollStateChanged(int state)
        {
    
        }
    展开全文
  • “在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]”  “假如开始下雨了,那么墙之间的水坑能够装多少水呢?” “以1×1...

             题目在伯乐在线中看到的,据说是twitter面试时的题目,感觉蛮有意思的。于是就将两种算法都用C++实现了,就当练练手吧。


            “在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]”

           “假如开始下雨了,那么墙之间的水坑能够装多少水呢?”


         “以1×1的方块为单位计算容积。所以,在上边的图中下标为1以左的都会漏掉。下标7以右的也会漏掉。剩下的只有在1和6之间的一坑水,容积是10”

            作者已经给出了两种算法,逻辑如下:

            两次遍历的算法:

            如果我们从左至右遍历列表,每个下标水的量最多是到现在为止最大的数。这表示如果我们已知右边有相等或更大的,我们可以知道存下的水有多少。反向遍历的时候也一样:如果我们知道左边有比右边最大的数更大的,我们装水是毫无问题的。

            基于这个想法,一个解决方法是:先找到最大值,从左遍历到最大值,然后从右遍历到最大值。这个方法需要两次遍历:一次找到最大值,另一次分成了两个子遍历。

            一次遍历的算法:

            一次遍历的方法通过两端的指针相向移动避免了寻找最大值。如果(左指针找到的左指针以左的最大值)小于(右指针找到右指针以右的最大值),将左指针向右移动一位。否则右指针向左移动一位。重复过程直到两个指针相遇。(解释起来很麻烦,但是代码很简单)

            下面是用C++的算法实现:

            两次遍历:

    /************************************************************************/
    /* 两次遍历的方法                                                                     */
    /************************************************************************/
    int calculateVolume(int arrays[],int length){
    	
    	//先求出数组中的最大值,第一次遍历
    	int max=0;//最大值
    	int max_pos;//最大值对于数组的下标
    	for (int i=0;i<length;i++)
    	{
    		if (max<arrays[i])
    		{
    			max=arrays[i];
    			max_pos=i;
    		}
    	}
    
    	int max_left=0;//从左边开始遍历时的极大值
    	int max_right=0;//从右边开始遍历时的极大值
    	int volume=0;//容积
    
    	//从左边开始向右遍历到最大值处
    	for(int i=0;i<max_pos;i++){
    		//不断更新左边的极大值
    		if (max_left<arrays[i])
    		{
    			max_left=arrays[i];
    		}
    		//否则,加上新增加的容积
    		else{
    			volume+=(max_left-arrays[i]);
    		}
    	}
    
    	//从最右边开始向左遍历到最大值处
    	for(int j=length-1;j>max_pos;j--){
    		//不断更新右边的极大值
    		if (max_right<arrays[j])
    		{
    			max_right=arrays[j];
    		}
    		//否则,加上新增加的容积
    		else{
    			volume+=(max_right-arrays[j]);
    		}
    	}
    	
    	return volume;
    }
    

    测试:

    void main(){
    	int arrays1[]={2,5,1,2,3,4,7,7,6};
    	int arrays2[]={2,5,1,3,1,2,1,7,7,6};
    	int arrays3[]={6,1,4,6,7,5,1,6,4};
    	std::cout<<"arrays1 voleme: "<<calculateVolume(arrays1,9)<<std::endl;
    	std::cout<<"arrays2 voleme: "<<calculateVolume(arrays2,10)<<std::endl;
    	std::cout<<"arrays3 voleme: "<<calculateVolume(arrays3,9)<<std::endl;
    }


            一次遍历的算法:

    /************************************************************************/
    /* 一次遍历的方法                                                                     */
    /************************************************************************/
    int calculateVolumeEx(int  arrays[],int length){
    	int pos_left=0;//从左开始遍历的指针的下标
    	int pos_right=length-1;//从右开始遍历的指针的下标
    	int max_left=arrays[pos_left];//从左开始遍历的过程中的极大值
    	int max_right=arrays[pos_right];//从右开始遍历的过程中的极大值
    	int volume=0;//保存容积的变量
    
    	//当右边的指针的下标大于坐标指针的下标时,重复循环
    	//循环调出时即遍历完了数组中的所有元素
    	while(pos_right>pos_left){
    
    		//如果左指针找到的极大值小于右指针找到的极大值,左指针右移
    		if (max_left<max_right)
    		{
    			pos_left=pos_left+1;
    
    			//当左指针指向的新的元素大于之前找到的极大值时,用新的值替换极大值
    			if (arrays[pos_left]>=max_left)
    			{
    				max_left=arrays[pos_left];
    			}
    			//否则总容积加上新的容积
    			else{
    				volume+=(max_left-arrays[pos_left]);
    			}
    		}
    		//如果左指针找打的极大值大于或等于右指针找到的极大值,右指针左移
    		else{
    			pos_right=pos_right-1;
    			int tmp_right=arrays[pos_right];//保存右指针指向的临时变量
    
    			//当右指针指向的新的元素大于之前找到的极大值时,用新的值替换极大值
    			if (arrays[pos_right]>=max_right)
    			{
    				max_right=arrays[pos_right];
    			}
    			//否则总容积加上新的容积
    			else{
    				volume+=(max_right-arrays[pos_right]);
    			}
    		}
    	}
    
    	return volume;
    
    }

    测试:

    void main(){
    	int arrays1[]={2,5,1,2,3,4,7,7,6};
    	int arrays2[]={2,5,1,3,1,2,1,7,7,6};
    	int arrays3[]={6,1,4,6,7,5,1,6,4};
    	std::cout<<"arrays1 voleme: "<<calculateVolumeEx(arrays1,9)<<std::endl;
    	std::cout<<"arrays2 voleme: "<<calculateVolumeEx(arrays2,10)<<std::endl;
    	std::cout<<"arrays3 voleme: "<<calculateVolumeEx(arrays3,9)<<std::endl;
    }


    展开全文
  • 如果每个cell是不同高度,则需要用到代码,核心思想是根据cell里面子控件的高度计算这个cell的高度

    (1)效果



    (2)源代码和素材下载

    http://download.csdn.net/detail/wsb200514/8089727


    (3)总结

    ——可以利用xib布局cell,但是这种情况的cell时固定高度

    ——如果每个cell是不同高度,则需要用到代码,核心思想是根据cell里面子控件的高度计算这个cell的高度

    ——这里面用到的知识点之一,计算一段文字所占据的高宽,就是确定文字大小,文字宽度之后,可以利用一个方法计算出这段文字的宽高,当然这个方法返回的东西很多,size只是其中之一的属性。

        CGSize nameMaxSize=CGSizeMake(MAXFLOAT, MAXFLOAT);
        NSDictionary *nameAttr=@{NSFontAttributeName:[UIFont systemFontOfSize:14]};
        CGSize nameSize=[self.status.name boundingRectWithSize:nameMaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:nameAttr context:nil].size;

    ——知识点之二,因为这个项目一打开的主页就是一个滚动的视图也就是一个tableView,所以我们可以删除项目原先的ViewController,创建一个tableViewController作为主入口。把这个控制器作为主入口的设置是:is Initial View Controller,打钩即可。(删除这个控制器自带的cell)



    ——知识点之三,还是封装。模型、视图、控制器各司其职。

    ——对于只提供外界访问的变量,即只有getter的那些变量,在@property时候增加一个readonly,防止被其他人修改。

    ——plist里面的number类型数据的1和0,可以被直接转换成BOOL 的0和1。

    ——修改cell高度的除了直接用tableView.cellHeight这个属性之外,还有一个代理方法,就是本例中用到的方法。

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    }

    ——对于部分控件,如果有的话就显示,如果没有就隐藏,这里面hidden属性至关重要,而且hidden的YES和NO最好是成对出现。因为这些cell会被放入缓存池,再次取出来使用的时候如果没有判断是否显示则会出错。

    展开全文
  • 微信小程序scroll-view组件自适应不同高度的手机

    千次阅读 热门讨论 2018-09-29 08:38:23
    已知微信相比于H5开发有rpx这个单位可以自适应一些不同宽度的手机,但是有的时候需要自适应一些手机高度贼大的手机比如iphoneX系列 所以scroll-view的wxss样式里肯定不能写死,我能想到的方法就是js里头加载画面前...

    已知微信相比于H5开发有rpx这个单位可以自适应一些不同宽度的手机,但是有的时候需要自适应一些手机高度贼大的手机比如iphoneX系列

    所以scroll-view的wxss样式里肯定不能写死,我能想到的方法就是js里头加载画面前再设置高度

    wxml里

    <scroll-view scroll-y style='height:{{scroll_height}}rpx'>
        // 一些标签
    </scroll-view>

    js

    Page({
      data: {
        scroll_height: 0,
        }
    })
    
    onLoad: function (options) {
        let windowHeight = wx.getSystemInfoSync().windowHeight // 屏幕的高度
        let windowWidth = wx.getSystemInfoSync().windowWidth // 屏幕的宽度
        this.setData({
          scroll_height: windowHeight * 750 / windowWidth - (本页面除了scroll以外其他组件的高度rpx) - 30
        })
      },

    根据屏幕的宽高计算出屏幕高度的rpx值,减去其他组件的高度得出scroll高度

    展开全文
  • 不同高度的图片 底部对齐方法

    千次阅读 2015-01-27 11:11:44
    看的图片是作为背景还是对象;背景的话直接就可以实现底部对齐,如果以对象插入,正如楼上所说,绝对定位(将要设置对齐的父div的定位样式position设置为relative,然后再将其自身div也就子div的position设置为...
  • 第一个,jq动态获取手机可视高度,然后去压缩页面内组件的高度; 第二个,判断登录来源的机型,然后给每一个尺寸机型写一个单独的页面; 当然这两个办法都太麻烦,效率不高; 最好的解决办法就是: 一般手机屏幕...
  • 有一组不同高度的台阶,有一个整数数组表示,数组中每个数是台阶的高度,当开始下雨了(雨水足够多)台阶之间的水坑会积水多少呢? 如下图,可以表示为数组[0,1,0,2,1,0,1,3,2,1,2,1],返回积水量6。 ""&...
  • 我靠,一看:要实现两个不同高度的UILabel的文字底部相对于下划线对齐 不是很简单吗? 是吗?你敢按你常规方法试试让你那火眼金睛的设计、美工去瞧瞧???   不管你怎么设置,是不是文字的高度和label的高度不一样...
  • 这个问题遇到几次了,每次都要在网上搜索解决... 在规则里面不检查器件高度这项应该是最简单,也不影响其他规则的方法了!  具体操作:  Design - rules - Component Clearance ,把下图2的位置 勾选去掉!  ...
  • 我们是来自两个不同高度世界的人

    千次阅读 2010-04-07 16:06:00
  • Viewpager有两个fragement高度不同 怎样使其自适应高度 不会被高度高的撑开
  • 不同分辨率调整div高度

    千次阅读 2017-10-20 11:07:40
    不同分辨率调整div高度问题在做easyui 表格页面时,一般是页面上半部分为搜索框部分,有时候由于搜索条件很多,在分辨率下正常的显示成一排,但在低分辨率下,搜索框区域会出现滚动条,而且你设置了不出现滚动条时,则有一...
  • css实现多列高度不同的div等高

    千次阅读 2018-04-30 20:43:02
    设置父容器设置超出隐藏(overflow:hidden),这样子父容器的高度就还是它里面的列没有设定padding-bottom时的高度,当它里面的任 一列高度增加了,则父容器的高度被撑到里面最高那列的高度,其他比这列矮的列会用...
  • 自适应iPhone的不同键盘高度

    千次阅读 2012-05-24 11:04:41
    IPAD键盘高度: portrait 264 landscape 352. iPhone键盘高度: Portrait 216 Landscape 140 背景:  ios5之前,iphone上的键盘的高度是固定为216.0px高的,中文汉字的选择框是悬浮的,所以不少...
  • 微信小程序顶部导航栏自定义,根据不同手机自适应距离状态栏高度 一、微信小程序顶部导航栏自定义 "navigationStyle": "custom" app.json "window": { "backgroundTextStyle": "dark", ...
  • 在框架中嵌套了页面,页面中有些DIV,但都没有...下面是笔者用js来判断不同浏览器的分辨率来动态设置的div高度  var getDiv = document.getElementById("MainArea");  getDiv.style.overflow = "auto";  if (na
  • 上面是RecycleView瀑布流基本用法 而下面则是将后台返回的值根据实际图片高比例,然后结合手机尺寸动态生成的高度。亲测很流畅不卡顿。 就是有个问题当布局滑动时imageView.measuredWidth的值会为0,这里给出了...
  • 如何获取到不同手机上tabBar的高度呢。首先这个tabBar是自定义的。 思路: 我们只要获取到 tabBar 元素的高度值就可以。 (1)在自定义组件或包含自定义组件的页面中,应使用this.createSelectorQuery()来代替,...
  • 样例二是更加随机的情况,可见于博主的文章:matlab代码 画出不同位置高度的圆柱--样例二 圆柱信息: 圆心(1,1)高 1 圆心(3,1)高 2 圆心(4,3)高 3 clc close clear %圆柱上表面自变量 [a,r]=ndgrid((0:...
  • iOS中动态计算不同颜色、字体的文字高度
  • 今天在设置布局时发现,我的xml布局里高度写死了,然后在子布局中用代码设置其高度,发现代码设置的高度要矮好多,网上搜索才知道: 代码写的是像素 而XML中(即dp)写的是单位密度。 两者是需要转换才能达到我们...
  • 不同浏览器获取DOM元素的各种高度

    万次阅读 2016-02-28 03:47:39
    HTML中高度和宽度的获取,跨浏览器兼容性,以及jQuery中操作
  • ionic3 不同slide高度,自动计算

    千次阅读 2018-01-18 15:00:32
    ionic的ion-slides一直有不同slide的高度为最大slide的高度的问题。 如果遇到 page1:height:1400px page2:height:932px, 两个页面的高度都会是1400px。 现在需要不同页面的高度从新计算, 我的解决方式...
  • 1.input在所有浏览器以及所有的版本中,都是定义了高度,然后再定义padding或者border值,这时候都会撑开,高度是本身的高度在padding值和border值 2.select在goole浏览器中以及ie8以上浏览器中,定义的height值...
  • 可以推出不同物体的高度比可以通过如下公式得到: 是左边指定物体的高度(图片中尺寸) 是右边指定物体的高度(图片中尺寸) 是左边指定物体的平均视差值 是右边指定物体的平均视差值 2、代码逻辑框图 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 594,322
精华内容 237,728
关键字:

不同高度