やること
- 画面のレイアウト定義
- 1行分のレイアウト定義
- リストアダプタの作成
- アクティビティクラスの作成
画面のレイアウト定義
画面のレイアウトはシンプルに、ListViewのみを配置した形に定義する。同じことを実現するためにListActivityというのが用意されているが、使用するメリットが薄い上にこれ系のクラス(TabActivityとか)には問題があったりもするので使わない。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
1行分のレイアウト定義
ListViewは、各行のレイアウトを自由にカスタマイズすることができる。単純に文字だけを表示するならAndroid標準で用意されているレイアウトを使うことも可能。
今回は、右端に三角形のマークを表示したいので、下記のようにLinearLayoutを定義、子要素としてTextViewとカスタムビューを配置する。TextViewにはlayout_weight="1"のオマジナイがしてあるのでTextViewの領域は限界まで広がり、残りの部分に三角形マークが配置される。
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tomokey="http://schemas.android.com/apk/res/com.tomokey"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical" >
<TextView
android:id="@+id/row_text"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_weight="1"
android:textColor="@android:color/white"
android:textSize="20dip"
android:minHeight="50dip"
android:gravity="center_vertical"/>
<com.tomokey.custom.view.Triangle
android:id="@+id/tri"
android:layout_width="7dip"
android:layout_height="15dip"
tomokey:color="@android:color/white"
tomokey:direction="right"
/>
</LinearLayout>
※画像を使わない縛りがあるために、com.tomokey.custom.view.Triangleというカスタムビューを利用している。俺は画像を使っちゃうぜ!って場合はImageViewとかにしておけばOK。 リストアダプタの作成
リストアダプタ(ListAdapter)はその名の通り、データとListViewを繋ぐためのもの。今回は配列データとListViewを繋ぐためのArrayAdapterを使って下記のようにリストアダプタを作成する。
ArrayAdapterのコンストラクタには、1行分のレイアウト定義とTextViewを指し示すIDを指定する。ArrayAdapterをそのまま利用する場合には、1行分のレイアウト定義にTextViewが含まれていなければならないし、そのTextViewにはIDが設定されていなければならない。
ListAdapter adapter
= new ArrayAdapter<String>(
this,
R.layout.row,
R.id.row_text,
DATA)
上記のコードで利用しているDATAはこんな感じ。
private static final List<String> DATA
= Arrays.asList(new String[]{
"Google",
"Apple",
"Microsoft",
"Research In Motion",
"Palm"
});
アクティビティクラスの作成
お決まりのコード達に加えて、ListViewウィジェットへリストアダプタを設定するコード(setAdapter)を追加する。
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// 画面のレイアウト定義を設定
setContentView(R.layout.main);
// ListViewウィジェットを取得
mListView = (ListView) findViewById(R.id.listview);
// この辺りで「リストアダプタの作成」をしておく
// リストアダプタを設定
mListView.setAdapter(adapter);
}
三角形マークは画像で行くぜ!って場合はここまでで終わり。ここからは、三角形をプログラムのみで実現する方法。
三角形のためにやること
- 三角形のプロパティ設計
- カスタムビュークラスの作成
三角形のプロパティ設計
設計などと仰々しく書いてみたけど、単純に三角形を使うとき何が変えられたら便利かを考えてXMLを書くだけ。今回は以下のように定義してみた。
変えられたら便利なとこ
三角形の色 三角形の方向
XML - res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="Triangle">
<attr name="color" format="color" />
<attr name="direction">
<enum name="right" value="0"/>
<enum name="left" value="1"/>
<enum name="top" value="2"/>
<enum name="bottom" value="3"/>
</attr>
</declare-styleable>
</resources>
Triangleという名前のカスタムビューについて、colorとdirectionという名前のプロパティを定義している。また、directionについては「right」「left」「top」「bottom」のいずれかが設定できて、それぞれ数字の0~3の値を持っている。
カスタムビュークラスの作成
カスタムビューとは、Androidアプリの各ウィジェットの基礎になっているViewクラスを独自に拡張して作成した、世界でたった一つの私だけのビュー・・・だ。以下、簡潔に。
定義package com.tomokey.custom.view; public class Triangle extends View定数
// 三角形の方向 public final static int DIRECTION_RIGHT = 0; public final static int DIRECTION_LEFT = 1; public final static int DIRECTION_TOP= 2; public final static int DIRECTION_BOTTOM = 3;インスタンス変数
// 描画オブジェクト private Paint mPaint; // 三角形の色 private int mColor; // 三角形の方向 private int mDirection;コンストラクタ
public Triangle(Context context, AttributeSet attrs)
{
super(context, attrs);
// 描画オブジェクトを初期化
mPaint = new Paint();
mPaint.setAntiAlias(true);
// XMLで定義されたプロパティ値を取得
TypedArray a =
context.obtainStyledAttributes(
attrs,
R.styleable.Triangle);
// 三角形の色を取得(デフォ:白)
mColor
= a.getColor(
R.styleable.Triangle_color,
0xFFFFFFFF);
// 三角形の方向を取得(デフォ:右)
mDirection
= a.getInt(
R.styleable.Triangle_direction,
DIRECTION_RIGHT);
}
プログラムから色を設定するメソッド public void setColor(String color)
{
mColor = Color.parseColor(color);
requestLayout();
invalidate();
}
ビューの描画メソッド @Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
// 三角形の色を設定
mPaint.setColor(mColor);
// 三角形の方向に応じてパスを生成
Path triangle = new Path();
switch (mDirection)
{
case DIRECTION_RIGHT:
// 左上から
triangle.moveTo(0, 0);
// まっすぐ左下へ
triangle.lineTo(0, getMeasuredHeight());
// んで、右端の高さは真ん中へ
triangle.lineTo(getMeasuredWidth(), (getMeasuredHeight() / 2));
break;
case DIRECTION_LEFT:
triangle.moveTo(getMeasuredWidth(), 0);
triangle.lineTo(getMeasuredWidth(), getMeasuredHeight());
triangle.lineTo(0, (getMeasuredHeight() / 2));
break;
case DIRECTION_TOP:
triangle.moveTo(0, getMeasuredHeight());
triangle.lineTo(getMeasuredWidth(), getMeasuredHeight());
triangle.lineTo((getMeasuredWidth() / 2), 0);
break;
case DIRECTION_BOTTOM:
triangle.moveTo(0, 0);
triangle.lineTo(getMeasuredWidth(), 0);
triangle.lineTo((getMeasuredWidth() / 2), getMeasuredHeight());
break;
}
// パスを塗りっと
canvas.drawPath(triangle, mPaint);
}

0 件のコメント:
コメントを投稿