Android開発ノート(12)サイズとボトムアップを測定


寸法測定の配置
コントロールの幅と高さの設定方法をご存知のように、カスタムビューの目的は、スクリーン上に所望のパターンを表示することです.それは、パターンを描く前に、まずこのパターンのサイズを知る必要があります.
一般的にxmlにはコントロールの幅と高さの三つの割当方法があります.
1、MATCH_PARDENT:上位コントロールと同じ大きさを表します.
2、WRAP_CONTENT:自分のサイズに合うという意味です.
3、具体的なdp値を直接付与する.
方式3は具体的な数値があります.計算しなくても分かります.方式1は上のコントロールと一致していますので、コントロールの大きさを順番に計測しても難しいことではありません.すみません、下のコントロールは文字の大きさや行数を確認しないといけないので、画像コントロールは画像の大きさ、引張りの状況を見なければなりません.だから、もしこの時に自分で一つ一つ計算したら(下のコントロールの個数も確定しません.)、これは頭が大きいと思います.
Androidは、上記の計算プロセスを自動的に完了するために、OneMeasre関数を提供しています.通常、私たちのカスタムコントロールは、この方法を書き換える必要はありません.もちろん、この文章は実際に開発された特殊な状況です.
寸法測定配置の3つのモードは、上のラウドゥに対応しています.widthとlayout_heightの3つの割当方式は、Androidのビューの下部にも3つの測定モードが提供されている.
1、Meass reSpec.AT_MOST:最大に達することを表しています.この定数の10進数は-2147483648で、割当方式のMATCH_に対応しています.パーティー
2、Meass reSpec.UNSPECIFIED:未指定(実際には適応)を表し、その定数の10進数は0であり、割当方式のWRAP_に対応する.CONTENT;
3、Meass reSpec.EXACT LY:正確さを表し、この定数の10進数は1073741824であり、割当方式の具体的なdp値に対応する.
これらの3つのモードをめぐって,get Child Meass reSpec,make Meass reSpec,measreなどの関連方法が生まれた.余談は控えて、直接に本題に入ります.測定モードの使い方を見てみます.また、どこで使いますか?
ドロップダウンリフレッシュフレーム中のサイズ測定多くのAPPはドロップダウンリフレッシュ機能があります.例えば、下のこの写真はドロップダウンリフレッシュの展示枠です.
通常のページが開いているのはこのコンボボックスがないので、ユーザがスクリーン上で指で下にスライドする時だけ、このコンボボックスを引き出して、アプリがドロップダウンイベントに応答してリフレッシュ処理を行います.この期間には、ドロップダウン領域の高さを取得して、ページ全体を下に移動させて、ドロップダウン枠領域を表示する必要があります.更新操作が終わったら、ページ全体を元の位置に戻しながら、下枠を回収します.
今問題なのは、更新する時、全体のページはどれぐらい下に移動しますか?この下振れの距離はドロップダウンゾーンの高さです.コードの中からドロップダウンゾーンの高さを計算すれば、適切な距離を移動できます.
Androidで規定された測定過程では、主に3つのステップがある.
1、幅と高さの測定モードを得る.
2、測定モードに従って測定する.
3、測定後の幅と高さの大きさを得る.
幅と高さの測定モードを得るには、まずターゲットビューの幅と高い値を取り、レイアウトパラメータから取得します.
ViewGroup.LayoutParams params = aViewObject.getLayoutParams();
int originWidth = params.width;
int originHeight = params.height;
取得したオリジナルサイズは-1の場合MATCH_を表します.PARDENTは-2の時にWRAP_を表します.CONTENT、残りの値は具体的な数値を表します.
次に,元のサイズに従って測定モードに整合し,ここでは幅モードを取得するためにget Child Meass reSpec法を採用し,高度モードを取得するためにmake Meass reSpec法を採用した.get Child Meass reSpecの利点は、マージンを設定することができ、通常の処理によって、我々はブランチ処理を必要としません.make Meass reSpecはより柔軟で、ドロップダウンリフレッシュのように、ドロップダウン領域の実際の高さを更新し続けます.オフセット量は負の数であるかもしれません.従来の処理によれば、-1でもないし、-2でもない負の数は正確な値として再適合されません.
		int widthSpec = ViewGroup.getChildMeasureSpec(MeasureSpec.UNSPECIFIED, 0, params.width);
		int heightSpec;
		if (params.height <= 0) {
			heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
		} else {
			heightSpec = MeasureSpec.makeMeasureSpec(params.height, MeasureSpec.EXACTLY);
		}
測定モードで計測するのは簡単です.上で計算した幅と高さのパターンをそのまま使って、measreを使ってください.もちろん、一つのビューのオブジェクトでメスアを操作します.
aViewObject.measure(widthSpec, heightSpec);
測定後の幅と高さの大きさを得るのはこれも簡単で、幅をgetMeasredWidthで取得し、高度をgetMeass redHeightで取得します.
int realWidth = aViewObject.getMeasuredWidth();
int realHeight = aViewObject.getMeasuredHeight();
下はドロップダウンリフレッシュの効果図です.
Pull Torefshは、ドロップダウンとリフレッシュの両方をサポートする広範なオープンソースフレームを使用して、ScrollView、ListView、GridViewの複数のビューをサポートするフレームを紹介します.
Pull Torefshは単独のプロジェクトで、ライブラリプロジェクトとして開発者自身のプロジェクトに導入する必要があります.Pull Torefshオブジェクトでよく使われる方法は、
set Mode:引張モードを設定します.Mode.PULL_FROMSTARTは、上から下へ引く(すなわち、下から更新する)ことを表し、Mode.PULL_FROMSTARTは下から上へ引く(すなわち上へ引っ張る)ことを表し、Mode.BOTHは下から更新することも上への負荷をサポートすると表しています.
get LoadingLayoutProxy:ロードエリアのオブジェクトを取得します.次にオブジェクトを呼び出す方法は以下の通りです.
--setPulLabel:引張時テキストの設定
--set Release Label:リリース時のテキストを設定します.
--setRefringLabel:リフレッシュ時のテキストを設定します.
--setLastUpdatedLabel:更新不要時のテキストを設定します.
set OnRefresh Listener:リフレッシュモニターを設定します.リフレッシュモニターは主にOnRefsh ListenerとOnRefresh Listenerの2種類があります.前者は普通の更新で、傍受方法onRefshを書き換える必要があります.後者は二重の更新で、傍受方法のonPullDown ToRefresh、onPulUpTorefsh(上拉傍受)を書き換える必要があります.
getRefresheblew:リフレッシュ可能なビューオブジェクトを取得する、例えばScrelView、ListView、GridViewなど、続いて、setAdapterなどのビューオブジェクトの対応する方法を呼び出すことができる.
以下はPulToRefreshの使用例コードです.
		PullToRefreshListView ptrl_hello = (PullToRefreshListView) findViewById(R.id.ptrl_hello);
		//     ,    
		//ptrl_hello.setMode(Mode.PULL_FROM_END);
		ptrl_hello.setMode(Mode.BOTH); //                
		//         
		ptrl_hello.getLoadingLayoutProxy().setLastUpdatedLabel("        ");
		ptrl_hello.getLoadingLayoutProxy().setPullLabel("    ");
		ptrl_hello.getLoadingLayoutProxy().setRefreshingLabel("     ...");
		ptrl_hello.getLoadingLayoutProxy().setReleaseLabel("    ");
		//         
		ptrl_hello.getLoadingLayoutProxy(false,true).setLastUpdatedLabel("        ");
		ptrl_hello.getLoadingLayoutProxy(false,true).setPullLabel("    ");
		ptrl_hello.getLoadingLayoutProxy(false,true).setRefreshingLabel("     ...");
		ptrl_hello.getLoadingLayoutProxy(false,true).setReleaseLabel("    ");
		
		ptrl_hello.setOnRefreshListener(new OnRefreshListener2<ListView>() {
			@Override
			public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
				Toast.makeText(FrameListActivity.this, "              ", Toast.LENGTH_LONG).show();
				ptrl_hello.onRefreshComplete();
			}

			@Override
			public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
				Toast.makeText(FrameListActivity.this, "              ", Toast.LENGTH_LONG).show();
				ptrl_hello.onRefreshComplete();
			}
		});
		
		String[] starArray = {"  ", "  ", "  ", "  ", "  ", "  "};
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
				R.layout.spinner_item, starArray);
		ptrl_hello.getRefreshableView().setAdapter(adapter);
この記事をダウンロードするには、フレームコードを更新します.