この章では、カスタムビューとタッチイベントを理解するために使用されます
ここでは、プロジェクト内の四角形を描画するために、ユーザのタッチとドラッグに応じてプログラムがあるでしょう
(1)これにより、単一のレイアウトフラグメントをインスタンス化し、SingleFragmentActivityを継承する活動のクラスを作成し、オブジェクトを作成するためにコードを変更し、DragAndDrawFragmentを返します
(2)レイアウトDragAndDrawFragmentを調製するために、フラグメントにactivity_drag_and_draw.xmlをリネーム - draw_and_draw.xml
その後DragAndDrawFragmentが、その後onCreateView()メソッドをカバーしたクラスを作成し、fragment_drag_and_draw.xmlをインスタンス化するために使用
(3)カスタムビュー
非常に単純なビューのカスタムビューの2種類があり、単純なビューは、それが常に集約ビュー・オブジェクト・組成物による重合法のカスタムビュー、他のビューを描画するために使用されるものである、子ビューを持っていない、重合は、一般的に表示するために使用されます管理サブビュー、グラフィックスレンダリングなし
以下は、カスタマイズされたビューを作成するために必要な3つの主要なステップです
(1)スーパークラスを選択し、単純なビューのために、私たちはスーパークラスとしてビューを選択することができ、それは真っ白なキャンバスですので、最も一般的なのスーパークラスとしてそれを使用し、集計ビューのために、私たちはスーパークラスのレイアウトを選択する必要がありますなどでframeLayoutなど
(2)選択されたスーパークラス、継承、カバースーパークラスのコンストラクタ
(3)ビューの動作をカスタマイズするために使用される他の重要な方法をカバー
BoxDrawingViewは、ここでそれが直接ビューを継承することができ、その後、2つのコンストラクタを追加するために、簡単な図であり、
パブリッククラスBoxDrawingViewは{ビューを拡張します
公共BoxDrawingView(コンテキスト・コンテキスト){
この(文脈、NULL);
}
公共BoxDrawingView(コンテキスト・コンテキスト、属性セットのATTRS){
スーパー(コンテキスト、attrsに);
}
}
コードは、ビューがXML属性をという名前のXMLレイアウトファイルが含まれている属性セットのインスタンスを受信するインスタンス化レイアウトファイルからコードやレイアウトファイルからインスタンス化することができるので、ここではその理由は、2つのコンストラクタを追加します、コンストラクタメソッドを使用するカスタムによると、だけでなく、2つのコンストラクタを追加していない場合でも、
カスタムビュークラスで、我々はそれを使用するレイアウトファイルにレイアウトを更新する必要があります
fragment_drag_and_draw.xmlを追加
<com.bignerdranch.android.draganddraw.BoxDrawingView
xmln:アンドロイド= "http://schemas.android.com/apk/res/android"
アンドロイド:layout_width = "match_parent"
アンドロイド:layout_height = "match_parent" />
あなたはBoxDrawingViewにクラスのフルパス名を与える必要があることに注意してくださいので、レイアウトインフレータはそれを見つけることができるように、レイアウトインフレータ解析レイアウトxmlファイル、およびあなたは完全なパスを与えていない場合は、ビューの定義に基づいて表示インスタンスを作成し、その後、インフレータとandroid.viewになります類似した名前を見つけるためandroid.widgetパッケージには、意志の崩壊を見つけることができません
この時点で、空のビューが表示され実行されます
(4)タッチイベントを処理
タッチイベントをリッスンしたタッチリスナーを設定、次の方法のビューを使用しています:
setOnTouchListener(View.OnTouchListener 1)
上記インターフェースの実現、イベントがタッチに送信されたときにのみ呼び出さを提供
しかし、ここでそれはビューのサブクラスであるため、私たちは直接、以下の方法を使用することができますカバー
パブリックブールonTouchEvent(MotionEventイベント){
}
この方法は、このクラスのMotionEventインスタンスがタッチイベントの位置と動作を説明するために使用することができるイベントのステージの動作の説明を受け
ACTION_CANCEL:親ビュータッチイベントを傍受します
MotionEvent方法でgetAction値()メソッドの動作を表示するために使用することができます
パブリックブールonTouchEvent(MotionEventイベント){
PointF電流=新しいPointF(event.getX()、event.getY())。
文字列のアクション=「」;
スイッチ(event.getAction()){
ケースMotionEvent.ACTION_DOWN:
アクション=「ACTION_DOWN」。
ブレーク;
}
trueを返します。
}
ここでxとPointFにパッケージ化されたオブジェクトのy座標、我々は2つの座標値、コンテナだけのために合格する必要があります
(5)イベントの動きを追跡
座標を記録することに加えて、主にこの目標を達成するために、画面上に長方形のボックスを描画するために使用されるBoxDrawingViewが知る必要がある(1)元の座標点定義される矩形、現在の座標点は、(2)長方形のボックスを定義する、我々はまた、マルチトラック録音から来る必要ボックスオブジェクトに格納されるデータのMotionEvent
パブリッククラスボックス{
プライベートPointF mOrigin。
プライベートPointF mCurrent。
パブリックボックス(PointF原点){
mOrigin =起源。
mCurrent =起源。
}
公共PointF getCurrent(){
mCurrentを返します。
}
公共ボイドsetCurrent(PointF電流){
mCurrent =現在;
}
public PonintF getOrigin(){
mOriginを返します。
}
}
だからときタッチビューは、新しいオブジェクトは、既存のボックスの長方形に追加されるユーザー・インターフェースを
今の状態を描画を追跡するためにBoxDrawingView、新しいボックスオブジェクトをバックアップ
プライベートボックスmCurrentBox。
プライベートリスト<ボックス> mBoxen =新しいArrayListを<>();
スイッチ(event.getAction()){
ケースMotionEvent.ACTION_DOWN:
アクション=「ACTION_DOWN」。
mCurrentBox =新しいボックス(現在の);
mBoxen.add(mCurrentBox)。
ブレーク;
ケースMotionEvent.ACTION_MOVE:
アクション=「DD」。
もし(mCurrentBox!= NULL){
mCurrentBox.setCurrent(現在)
無効(); //これは、自己再ドローになるだろうこれは、BoxDrawingViewの失敗を行い、再びonDraw(キャンバス)法と呼ばれます
ブレーク;
}
ケース:MotionEvent.ACTION_UP:
アクション= "";
mCurrentBox = NULL;
ブレーク;
}
ケースMotionEvent.ACTION_CANCEL:
アクション=「」
mCurrentBox = NULL;
trueを返します。
}
今作用のちょうど受信座標ACTION_DOWN、元のイベントに関連して新しいオブジェクトの確立を座標とmCurrentBoxボックスを割り当て、その後に矩形アレイに追加します
パターンを描画する(6)onDraw()メソッド
アプリケーションの起動後に、すべてのビューは、そのビューは、この問題を解決するために、画面に策定されていない、非アクティブ状態にあり、Androidは上から下になり、トップビュービューを描画()メソッドを呼び出します子ビューを描画し、その後、すべての最初は、完全な自己ドローを表示し、連鎖反応と呼ばれ、その後、子供を描く子ビューの自己図であり、すべてのビュー自体が描かれ、このコール継承構造の終わりに、最もビュートップビューも力になっています
この図に加えて、以下の方法が覆われていてもよいです
保護されたボイドonDraw(キャンバスキャンバス){
}
二つのカテゴリーがありますAndroidの中で描きます
Canvasクラスは、我々が必要とするすべての操作を集めている、この方法は、円形として、描画すると、何を描画する場所を決めることができます
ペイントクラスが満たされていない、それはグラフィックスなどのグラフィックス機能を、レンダリングする方法を指定することができ、描画する方法を決定し、どのようなフォントレンダリング
(7)ペイントを作成します
プライベートペイントmBoxPaint。
プライベートペイントmBackgroundPaint。
BoxDrawingView(コンテキスト属性セット)方法でインスタンス化します
公共BoxDrawingView(コンテキスト・コンテキスト、属性セットのATTRS){
スーパー(コンテキスト、attrsに);
mBoxPaint =新しいペイント();
mBoxPaint.setColor();
mBackgroundPaint.setColor();
}
ペイントオブジェクトを使用すると、その後は、画面上の四角形を描画することができます
(8)onDraw(キャンバス)メソッドをカバー
保護されたボイドonDraw(キャンバスキャンバス){
canvas.drawPaint(mBackgroundPaint)。
{:(mBoxenボックスボックス)について
左フロート= Math.min(box.getOrigin()X、boxgetCurrent()X。);
フロート右= Math.max(box.getOrigin()X、boxgetCurrent()X。);
フロートトップ= Math.min(box.getOrigin()Y、boxgetCurrent()Y。)。
フロートの底= Math.max(box.getOrigin()Y、boxgetCurrent()Y。)。
canvas.drawRect(左、上、右、下、mBoxPaint)。
}
}
今、あなたは、いくつかの四角形を描画することができます