1. 程式人生 > >安卓瀑布流適應ScrollView標籤控制元件

安卓瀑布流適應ScrollView標籤控制元件

此文章參考http://blog.csdn.net/jdsjlzx/article/details/45042081

感謝大神提供的幫助 尊重原創

最近碰到個需求   彈窗標籤流  彈窗高度有限   但是後臺標籤超過範圍需要巢狀  ScrollView   此文章只是為了解決上面連結巢狀ScrollView無效問題

public class XCFlowLayoutScrollView extends ViewGroup{
//儲存所有子View  
    private List<List<View>> mAllChildViews = new ArrayList<>();  
    //每一行的高度  
    private List<Integer> mLineHeight = new ArrayList<>();  
    
    public int viewHeight = 0;
      
    public XCFlowLayoutScrollView(Context context) {  
        this(context, null);  
    }  
    public XCFlowLayoutScrollView(Context context, AttributeSet attrs) {  
        this(context, attrs, 0);  
    }  
    public XCFlowLayoutScrollView(Context context, AttributeSet attrs, int defStyle) {  
        super(context, attrs, defStyle);  
    }
    @Override  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    //父控制元件傳進來的寬度和高度以及對應的測量模式  
        int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);  
          
        //如果當前ViewGroup的寬高為wrap_content的情況  
        int width = 0;//自己測量的 寬度  
        int height = 0;//自己測量的高度    下面的計算公式存在bug 所以用mLineHeight  替換
        //記錄每一行的寬度和高度  
        int lineWidth = 0;  
        int lineHeight = 0;  
          
        //獲取子view的個數  
        int childCount = getChildCount();  
        for(int i = 0;i < childCount; i ++){  
            View child = getChildAt(i);  
            //測量子View的寬和高  
            measureChild(child, widthMeasureSpec, heightMeasureSpec);  
            //得到LayoutParams  
            MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams();  
            //子View佔據的寬度  
            int childWidth = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;  
            //子View佔據的高度  
            int childHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;  
            //換行時候  
            if(lineWidth + childWidth > sizeWidth){  
                //對比得到最大的寬度  
                width = Math.max(width, lineWidth);  
                //重置lineWidth  
                lineWidth = childWidth;  
                //記錄行高  
                height += lineHeight;  
                lineHeight = childHeight;  
            }else{//不換行情況  
                //疊加行寬  
                lineWidth += childWidth;  
                //得到最大行高  
                lineHeight = Math.max(lineHeight, childHeight);  
            }  
            //處理最後一個子View的情況  
            if(i == childCount -1){  
                width = Math.max(width, lineWidth);  
                height += lineHeight;  
            }  
        }  

//已下只是單獨針對ScrollView     一般標籤使用  使用上處連結程式碼即可
        viewHeight = 0;
            for(int i = 0; i < mLineHeight.size();i++){
            viewHeight = mLineHeight.get(i)+ viewHeight;
            }
            setMeasuredDimension(resolveSize(width, widthMeasureSpec),
                    resolveSize(viewHeight, heightMeasureSpec));
    }  
      
    @Override  
    protected void onLayout(boolean changed, int l, int t, int r, int b) {  
    mAllChildViews.clear();  
        mLineHeight.clear();  
        //獲取當前ViewGroup的寬度  
        int width = getWidth();  
          
        int lineWidth = 0;  
        int lineHeight = 0;  
        //記錄當前行的view  
        List<View> lineViews = new ArrayList<View>();  
        int childCount = getChildCount();  
        for(int i = 0;i < childCount; i ++){  
            View child = getChildAt(i);  
            MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();  
            int childWidth = child.getMeasuredWidth();  
            int childHeight = child.getMeasuredHeight();  
              
            //如果需要換行  
            if(childWidth + lineWidth + lp.leftMargin + lp.rightMargin > width){  
                //記錄LineHeight  
                mLineHeight.add(lineHeight);  
                //記錄當前行的Views  
                mAllChildViews.add(lineViews);  
                //重置行的寬高  
                lineWidth = 0;  
                lineHeight = childHeight + lp.topMargin + lp.bottomMargin;  
                //重置view的集合  
                lineViews = new ArrayList();  
            }  
            lineWidth += childWidth + lp.leftMargin + lp.rightMargin;  
            lineHeight = Math.max(lineHeight, childHeight + lp.topMargin + lp.bottomMargin);  
            lineViews.add(child);  
        }  
        //處理最後一行  
        mLineHeight.add(lineHeight);  
        mAllChildViews.add(lineViews);  
          
        //設定子View的位置  
        int left = 0;  
        int top = 0;  
        //獲取行數  
        int lineCount = mAllChildViews.size();  
        for(int i = 0; i < lineCount; i ++){  
            //當前行的views和高度  
            lineViews = mAllChildViews.get(i);  
            lineHeight = mLineHeight.get(i);  
            for(int j = 0; j < lineViews.size(); j ++){  
                View child = lineViews.get(j);  
                //判斷是否顯示  
                if(child.getVisibility() == View.GONE){  
                    continue;  
                }  
                MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();  
                int cLeft = left + lp.leftMargin;  
                int cTop = top + lp.topMargin;  
                int cRight = cLeft + child.getMeasuredWidth();  
                int cBottom = cTop + child.getMeasuredHeight();  
                //進行子View進行佈局  
                child.layout(cLeft, cTop, cRight, cBottom);  
                left += child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;  
            }  
            left = 0;  
            top += lineHeight;  
        } 
    }
    
    /**  
     * 與當前ViewGroup對應的LayoutParams  
     */  
    @Override  
    public LayoutParams generateLayoutParams(AttributeSet attrs) {  
        return new MarginLayoutParams(getContext(), attrs);  
    }  
}  

相關推薦

瀑布適應ScrollView標籤控制元件

此文章參考http://blog.csdn.net/jdsjlzx/article/details/45042081 感謝大神提供的幫助 尊重原創 最近碰到個需求   彈窗標籤流  彈窗高度有限   但是後臺標籤超過範圍需要巢狀  ScrollView   此文章只是為了解

瀑布錯亂 滑動閃爍 頂部留白 的解決方案

基本上網上給出的解決問題方案為: layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE)   recyclerView.addOnScrollListener(ne

學習小碼哥自定義控制元件的筆記(三)

package com.example.wtz.viewpagerdemo; import android.graphics.Color; import android.support.annotation.NonNull; import android.support.v4.view

學習小碼哥自定義控制元件的筆記(六)

<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="ScrollingView"> <attr name="scrolli

:一個簡單的日期選擇控制元件

package com.example.listpickerdialog; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; impo

unity 解析度自適應方法及ScrollView控制元件適應問題

專案所需,unity需要自適應解析度,尤其需要適應全屏模式。 設定方法: 設定Canvas 屬性,如下圖 主要設定的屬性包括: Render Mode 設定為 Screen Space Canvase Scaler 的UI Scale Mode 為 Scale with Screen

手機通過ssh遠端登入控制Ubuntu系統

1 前言 眾所周知,android手機使用的是linux核心,可以這麼說,安卓系統就是一個linux系統。而linux系統最神祕,最精彩的地方是命令,安卓系統能不能執行linux命令呢? 答案是肯定的!通過本教程,你就可以輕鬆的用你的手機遠端遙控你的linu

FacebookFeed的記憶體優化實踐

引言 大量的使用者每天在Android裝置上使用Facebook,滾動新聞Feed流頁面,包括個人資料,活動,頁面和組,與他們關心的人員和資訊進行互動等一系列行為。 所有這些不同的Feed型別都由Android Feed Platform小組建立的平臺提供支援

那些年我們熬夜打造一可收縮標籤控制元件

一、前言 時間匆匆,一眨眼來廈門已經一個多月了。似乎已經適應了這邊的生活,喜歡這邊的風,溫和而舒適,還有淡淡海的味道 。。。 還在再次跟大家致個歉意,部落格的更新又延期了。新的環境,新的工作加上專案大改版,基本每天都有大量的事情,週末也不得空閒。 非常感謝

Android 仿蘑菇街列表彈出和瀑布ScrollView+RelativeLayout實現)

之前看到用線性佈局寫的瀑布流,覺得不大好,自己想了另外一種方案, (最近發現用 網頁實現瀑布流 再用WebView載入才能完美實現效果) 原理使用RelativeLayout任意定位位置  核心方法 private void addViewByMargins(Re

MFC標籤控制元件 CTabCtrl

CTabCtrl 標籤頁使用 引用 TabSheet.h .cpp 新增到專案中 拖入控制元件 tab ctrl 新增變數  型別 TabSheet型別 建立兩個 標籤頁  屬性 border 改為 none&nbs

android 禁止scrollview控制元件變化自動滾動到底的方法

網上的說法是焦點問題導致,新焦點在下面時,檢視會滾動使焦點可見。但網上提的在scrollview裡層的LinearLayout裡新增    android:focusable="true" android:focusableIn

Winform/C#入門程式設計之第二部分常用控制元件(六:標籤控制元件Label)

簡介:         介紹標籤控制元件Label。一般單獨或者配合編輯框控制元件等使用,用作提示或解釋等。   介紹: 1.屬性 常用屬性 Name 獲取或設定控制元件的名稱

翻翻git之---一個簡單的標籤控制元件 LabelView (隨手發了兩張小寶寶的玩耍照)

P1:這部分為廢話技術內容在P2,不想看的可跳過 最近每天都是在照顧魚,麥麥,噹噹之間遊離回家幾乎沒學習,沒敲程式碼,或者說沒開工作電腦,慢慢的罪惡感,貼兩張週末小朋友們玩耍的照片 但是生活還是很重要的,不能讓自己成為賺錢的工具,畢竟賺的不多

標籤控制元件中放入對話方塊,且對話方塊裡是列表

背景:公司要求將相關資訊顯示在列表中,且利用標籤控制元件來進行切換。 問題描述:之前是將相關列表的初始化是放在對話方塊的OnInitDialog()函式中,且保證了標籤控制元件的切換沒有問題。但是在切換的過程中,當焦點不在標籤項,點選其它標籤項再切換到原標籤項時,原標籤項中並不能顯示出

標籤控制元件中顯示對話框出現的問題及解決方法

問題描述: 1.整體對話框出現時,理應出現在標籤控制元件當中的對話方塊飛出去了,沒有在標籤控制元件當中; 2.標籤控制元件切換的時候有問題,並不是所有的標籤選項都可以切換到。 解決方法: 1.飛出去的解決方法: 過程:在查詢標籤控制元件所在的螢幕座標系和客戶區座標

ios 中使用xib拖拽的scrollview中子控制元件位置偏移

1.問題描述:在xib中拖拽了一個scrollview,並且為之添加了約束,然後從xib中例項化了自定義view新增到scrollview後,發現這個自定義view的子控制元件位置都偏移了。 2.問題

android之用scrollview實現控制元件滑動固定效果

專案中最近用到需要佈局滑動到某一個地方的時候某個控制元件固定在螢幕頂部不動,就去研究了下,思路其實挺簡單的。我置頂的懸浮控制元件上邊還需要留個控制元件,比如搜尋框之類的,專案需求不一樣就留的不一樣,所以就研究了一下,網上也有很多,其實方法思路都一樣的,很簡單,自定義一下Sc

android商品屬性選擇標籤控制元件,可實現自動換行

一、demo功能 在電商專案中,商品屬性選擇是必不可少的,而且屬性的數目和長度不是固定的,就有了 “標籤選擇”。以下我就借用了開源的AutoFlowLayout控制元件,根據商品屬性選擇要求寫了這個demo,和大家分享 二、程式碼介紹 1.功能 AutoFlo

Android 標籤控制元件

轉載:http://blog.csdn.net/wangjinyu501/article/details/38089061 在有的應用中可能需要設定一些標籤來方便用去去查詢某些資訊,比如手機助手或者購物軟體之類都會有一些標籤。對於軟體開發初期來說,直接使用TextView、B