自分のビューグループを定義

7203 ワード

オリジナルを尊重:http://blog.csdn.net/yuanzeyao/article/details/40264433
長い間文章を書いていませんでしたが、今週末の時間を利用していくつかの知識をまとめ、理解を深めることができます.今日はカスタムView Groupを実現する方法を学びます.
Androidでよく使われるレイアウトLinearLayout,FrameLayout,RelativeLayout..これらのレイアウトはすべてView Groupから継承されています.これらのレイアウトを通じて、Androidのすべてのインタフェースの開発をほとんど実現することができますが、一般的で複雑なレイアウトについては、これらの基本レイアウトの開発を使用すると、いくつかの再構築作業に多くの時間がかかります.これらの基本レイアウトを真似することはできません.自分のニーズに合わせて自分のレイアウトを実現して、後で必要なときに直接持ってきて使いますか?もちろんいいです.
トランプのようなレイアウト
定义自己的ViewGroup_第1张图片
闘地主のゲームでは、このようなレイアウトによく遭遇します.私はこのレイアウトをカスケードレイアウトと呼びましょう.このレイアウトはRelativeLayoutやmarginなどを使ってよく知っていますが、便利ではありませんか.今日はこのようなニーズを背景にカスタムView Groupについて説明します.
カスタムレイアウトを学ぶ前に、読者はまずAndroidのレイアウトがどのように描かれているかを理解したほうがいいです.公式サイトのいくつかの文章1、http://developer.android.com/guide/topics/ui/how-android-draws.html2、http://developer.android.com/reference/android/view/ViewGroup.html3、http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html以上の文章を通じて、私たちは知識を理解する必要があります:1、レイアウトを描くのは2つの過程から構成されています:測定過程とレイアウト過程、測定過程はmeasure(int,int)方法で完成して、遍歴が完成した後に、すべてのViewの大きさはすべて確定して、レイアウト過程はlayout方法で完成して、Viewの大きさを通じて、Viewを上の場所に置くことを決定して、しかし、ソースコードのmeasureとlayoutの方法はfinalタイプなので、私たちは書き換えることができません.finalと定義したのは、開発者がレイアウトの絵画の流れを破壊することを避けることですが、測定とレイアウトの詳細はonMeasureとonLayoutを書き換えることで実現することができます.2、View Groupは前にも言ったように、AndroidのすべてのレイアウトはView Groupから継承されています.View GroupはViewのコンテナです.タスクのViewを置くことができます.どのように配置するかは、onMeasureとonLayoutで定義することができます.onMeasureはmeasureで呼び出し、onLayoutはlayoutで呼び出した3、View Groupです.LayoutParamsというクラスは主にViewが父の容器にどのように表示したいかを教えてくれます.例えば、幅、高さ、中央などです.ViewGroup.LayoutParamsの中で最も重要な2つのパラメータはwidth,heightです.marginプロパティを使用する場合は、ViewGroupを使用する必要があります.MarginLayoutParamsというクラスで、このクラスはView Groupから継承されています.LayoutParams.marginプロパティのサポートが追加されました.より多くのプロパティを追加したい場合は、LayoutParamsクラスを定義して必要なプロパティを追加することができます.実際にはLinearLayoutなどのレイアウトはView Groupから継承されています.MarginLayoutParamsは、自分の必要な属性を追加しました.
独自のレイアウトを実現java
/**
 *      ,         
 * com.myviewgroup.CascadeLayout
 * @author yuanzeyao 
* create at 2014 10 19 4:15:42 */ public class CascadeLayout extends ViewGroup { /** * */ private int horizontal_space; /** * */ private int vertical_space; public CascadeLayout(Context context) { super(context); } public CascadeLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initAttribute(context, attrs); } public CascadeLayout(Context context, AttributeSet attrs) { super(context, attrs); initAttribute(context, attrs); } /** * xml horizontal_space,vertical_space * @param context * @param attrs */ private void initAttribute(Context context,AttributeSet attrs) { TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.CascadeLayout); horizontal_space=a.getDimensionPixelSize(R.styleable.CascadeLayout_horizontal_space,this.getResources().getDimensionPixelSize(R.dimen.cascade_horizontal_spacing)); vertical_space=a.getDimensionPixelSize(R.styleable.CascadeLayout_vertical_space, this.getResources().getDimensionPixelSize(R.dimen.cascade_vertical_spacing)); a.recycle(); } /** * onMeasure measure , CascadeLayout */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // measureChildren , for , measurechild measureChildren(widthMeasureSpec, heightMeasureSpec); // CascadeLayout measureWidth,measureHeight setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); } /** * View */ @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { for(int i=0;i

CascadeLayoutでは、2つのプロパティを定義しました.horizontal_space,vertical_space、この2つのプロパティは、レイアウト内の各サブViewの前の垂直距離と水平距離を記録するために使用され、構造関数で初期化されます.属性を追加したのでres/valuesでattrsを定義します.xmlファイル


    
        
        
    

layoutファイルでのCascadeLayoutの使用

   
    
    
     
     
      

運転効果は以下の通りです.
定义自己的ViewGroup_第2张图片
自分のLayoutParamsをカスタマイズ
CascadeLayoutではViewGroupを使用しています.LayoutParamsクラスですが、このクラスにはwidthとheightのプロパティしかありません.他のプロパティを追加したい場合は、LayoutParamsクラスを自分で定義する必要があります.次は自分のLayoutParamsクラスをカスタマイズします.このクラスはView Groupを継承します.MarginLayoutParams、だから私のカスタマイズしたLayoutPramsはmarginの属性を持っています
CascadeLayoutでは、LayoutParamsクラスを次のように定義します.
public static class LayoutParams extends ViewGroup.MarginLayoutParams
  {
    /**
     *             ,    CascadeLayout  vertical_space  
     */
    private int layout_vertical_spacing;

    public LayoutParams(Context c, AttributeSet attrs)
    {
      super(c, attrs);
      TypedArray a = c.obtainStyledAttributes(attrs,
          R.styleable.CascadeLayout_LayoutParams);
      try {
        layout_vertical_spacing = a
            .getDimensionPixelSize(
                R.styleable.CascadeLayout_LayoutParams_layout_vertical_spacing,
                -1);
      } finally {
        a.recycle();
      }
    }

    public LayoutParams(int width, int height)
    {
      super(width, height);
    } 
  }

このLayoutParamsはlayoutをサポートしています.vertical_spaceingプロパティです.さあ、ここまで书いておきましょう.何か分からないことがあったら、皆さんのメッセージを歓迎します...