自定ビューのまとめ


Androidプログラマー日記
著者:賢楡の魚
参考読書時間:5 min 15 s
ガイド:カスタムコントロールはこの1編だけでは足りません.
前言
以前は「カスタムビューの拡張」、「カスタムビューの複合」、「カスタムビューの完全なカスタマイズ」の3つの文章でそれぞれ1つの例を書きました.もちろん、例は比較的簡単で、主な原因は個人のレベルが限られているのかもしれません.しかし、それでも、私はできるだけ私の話の内容をもっとはっきり表現します!では、私たちの頭の中でこの知識の枠組みをよりよく構築するために(この言葉はあまりにも専門的で、私に書くのにプレッシャーを感じさせました!実はいくつかの重要な内容や使うことができる内容を、私たちの脳にもっと深い印象を残し、彼たちの間にもっと多くのつながりを与えることができます).私たちが必要とするときに、より簡単に抽出して使うことができます!そのために、まとめを書くのもいい方法です!この観点は『暗い時間』から来ています!
本文
まず、カスタムビューを拡張、複合、完全カスタムの3つのタイプに分けます(もちろん、別のタイプでもいいです).彼らは確かに易から難への勾配関係があるように見えます!いずれにしても、この3回の知識点とカスタムViewの知識点をまとめてみましょう.メリットは、私の「Androidプログラマー日記」の公衆番号に多くの人が注目しているかもしれません.
プログラマーはゼロからカウントしていると言われていますが、始めましょう.
[0]カスタムビューの3つの構築方法について
  • パラメータの構築方法:コードでカスタムviewを動的に追加するときに呼び出されます.
  • の2つのパラメータの構造方法:xml+inflateの方法を使用してコントロールを追加すると呼び出され、中には1つのAttributeSetタイプの値
  • が追加されます.
  • の3つのパラメータの構築方法:この構築方法システムは呼び出しません.呼び出しを表示してdefStyleAttrに値を伝える必要があります.defStyleAttrパラメータが1つ増えました.これは、このviewがstyleリソースを参照する属性パラメータです.つまり、styleで自己定義Viewのためにデフォルトの属性スタイルを定義して追加することができます.
  • [1]3種類のカスタムビューについて
  • 拡張:拡張カスタムViewは、Android固有のViewから継承されます.たとえば、TextView、ImageViewなどです.onDrow()などのコールバックメソッドを書き換えることで拡張します!私たちが望んでいるより良いスタイルやスタイルを実現させます!
  • 注意:このメソッドで実装されるカスタムViewコントロールは、wrap_を独自にサポートする必要はありません.contentとpadding.
  • 組み合わせ:
    
          View   ViewGrop  View :LinearLayout、RelativieLayout 。           View        ,           。
    
    ** :**        View       ViewGroup           。
    
  • 完全カスタム:
         View   View(android        ),                    ,                     !
    
    ** :**         View        wrap_content padding。
    
  • [2]一般的なコールバック方法
  • onFinishInflate():XMLコンポーネントをロードした後、
  • コールバック
  • onSizeChanged():コンポーネントサイズが変更されたときにコールバック
  • onMeasure():測定(wrap_contentにサポートされるコードを実現する)のためにこの方法をコールバックする
  • .
  • onLayout():このメソッドをコールバックして位置
  • を表示します.
  • onTouchEvent():タッチイベントのコールバックを傍受し、インタラクションを実現する上で非常に重要なコールバック方法でもある
  • onDraw():このメソッドをコールバックして、私たちのコントロールを
  • に描画します.
    [3]カスタムビューにカスタム属性を追加して使用するプロセス
    Step 1:Valuesの下にattrsを作成する.xml(もちろん別の名前で命名することもできますが、制限はありません)、このファイルにカスタムViewのカスタムプロパティを追加します!
    Step 2:カスタムビューの構築方法でカスタム属性値を取得し、該当する位置に値を割り当てます.
    Step 3:xmlでカスタムコントロールを使用し、そのカスタム属性を設定する
    注意:xmlでカスタムコントロールを使用する場合は、以下を必ず追加します.
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    もちろんあなたも書くことができます
    xmlns:custom="http://schemas.android.com/apk/res/com.timen4.t3」(com.timen 4.t 3はアプリのエントリーです)
    この2つの方式には本質的な違いはない.customについては、好きなように名前をつけてもいいです.
    [4]完全カスタムコントロールではwrap_をサポートしています.contentとpaddingのコード
  • MeasureSpec
  • 概要:MeasureSpecは32ビットint値、上位2ビットはSpecMode(測定モード)、下位30ビットはSpecSize(指定モードでの仕様サイズ)を表します.
  • 3種類のSpecModeとSpecSize
    1.UNSPECIFIED:         ,      ,            。          。
    
    2.EXACTLY:        View        ,  V         SpecSize     。    LayoutParams  match_parent          
    
    3.AT\_MOST:             SpecSize,View          ,       View     。    LayoutParams  wrap_content。
    
  • MeasureSpecとLayoutParamsの対応関係
       View(    View) MeasureSpec     MeasureSpec    LyoutParams      ,MeasureSpec     ,onMeasure      View     。     View( )
    
    
  • 対wrap_contentのサポートonMeasure()メソッドでwrap_を実現contentのサポート
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSpecSize= MeasureSpec.getSize(widthMeasureSpec);
        int heightSpectMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSpecSize=MeasureSpec.getSize(heightMeasureSpec);
        //     wrap_content   
        if(widthSpecMode==MeasureSpec.AT_MOST&&heightSpectMode==MeasureSpec.AT_MOST){
            //             View     
            setMeasuredDimension(200,200);
        }else if(widthSpecMode==MeasureSpec.AT_MOST){
            setMeasuredDimension(200,heightSpecSize);
        }else if (heightSpectMode==MeasureSpec.AT_MOST){
            setMeasuredDimension(widthSpecSize,200);
        }
    }
  • paddingのサポートonDraw()メソッドでpaddingのサポートを実現するには、コントロールやコントロールの際にpaddingを考慮すればよい.自分で実現しなければ、カスタムViewにpaddingを設定するのは無効です.
    @Override
       protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //          View padding  
        final int paddingLeft = getPaddingLeft();
        final int paddingRight = getPaddingRight();
        final int paddingTop = getPaddingTop();
        final int paddingBottom=getPaddingBottom();
        int width = getWidth()-paddingLeft-paddingRight;
        int height = getHeight()-paddingBottom-paddingTop;
        int radius = Math.min(width,height)/2;
        canvas.drawCircle(paddingLeft+width/2,paddingTop+height/2,radius,mPaint_while);
    }
    
  • [5]カスタムViewのインタフェースコールバックを定義して実装するプロセス
    このセグメントのサンプルコードは「カスタムViewの複合式」から来ており、必要に応じて注釈の修正を行い、コールバック方法を実現するために簡略化されています.
    Step 1:コールバックインタフェースの定義(Viewクラスの操作をカスタマイズ)
    public interface TopBarClickListener {
        void leftClick();
    }
    
    Step 2:コールバックインタフェースの露出(カスタムViewクラスでの操作)
    public void setOnTopbarClickListener(TopBarClickListener mListener){
        this.mListener=mListener;
    }
    
    Step 3:コールバックインタフェースを呼び出す(Viewクラスの操作をカスタマイズ)
    
    private void bindEvents() {
        mLeftButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mListener!=null){
                    mListener.leftClick();
                }
            }
        });
    }
    
    Step 4:コールバックインタフェースおよびメソッドの実装(カスタムViewオブジェクトをインスタンス化するクラス)
    mtopBar.setOnTopbarClickListener(new TopBar.TopBarClickListener() {
        @Override
        public void leftClick() {
            Toast.makeText(MainActivity.this,"   ",Toast.LENGTH_SHORT).show();
            if (index<=0){
                index=3;
            }else{
                index--;
            }
            iv_image.setImageResource(images.get(index));
        }
    
    後記
    さあ、このまとめはこれだけです!私はもう一度強調しなければなりません.本文の最も重要な一言は、一番前のガイド語です.カスタムコントロールはこの1編だけを見て、足りません.この言葉は冗談ではありません.信じなくても大丈夫です.どうせ私はどこにもいません.私の美貌に賭けません.
    実は、私が自分の書いたものに自信がないだけでなく、私のこの編でも、ある牛が書いたのでもあります.私はすべてカスタマイズのViewがある1篇を見るのが足りないと思っています!初心者や初心者にとってはなおさらです.私が前言で書いたように、私たちは自分の知識アーキテクチャを構築しているからです.私たちはもっと多くの角度から、私たちが学んだことや勉強しなければならない内容を理解する必要があります.このようにしてこそ、私たちが理解し、記憶するのに役立ちます.実際に応用するのに役立ちます!
    最後に一言をまとめましょう.「私たちが勉強しているもの」は「ある編」を見ても足りません.
    私の微信の公衆番号に注目することができるのが好きで、Androidだけではありません!