概ねタイトルとおりです。
これまで色々なViewを紹介してきましたが、今回は自分でViewを作成して独自の処理を作る方法を紹介してみます。
今回はタッチした場所に小さい画像を表示する、
「スタンプ機能」を持つ独自のViewを作成する方法を紹介してみます(^ω^)
ActivityでaddViewメソッドを使いレイアウトにViewを追加する
今回追加するViewクラスの名前は「SampleView」とします。
追加したいアクティビティの中でインスタンスを生成。
他のViewなどと同じようにレイアウトに追加するだけです。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout ll = new LinearLayout(this); setContentView(ll); SampleView sv = new SampleView( this ); ll.addView(sv); }
ファイルを新規作成して追加。Viewクラスを継承したクラスを作成
アクティビティがある階層に「SampleView.java」というファイルを作成します。
Viewクラスを継承(extends)します。
まだ中身は何もなくていいので、コンストラクタのみを書いておきます。
import android.content.Context; import android.view.View; public class SampleView extends View{ // コンストラクタ public SampleView(Context context) { super(context); } }
Viewに独自の機能を実装する
今回作成するSampleView に以下の2つの機能を実装します。
・Canvasの描画
・タッチされた場所に画像を配置
CanvasとBitmapをメンバ変数に追加。
画面変更時に呼び出されるonSizeChangedに初期化処理。
onDrawメソッドをオーバーライドしてBitmapを描画する処理を作成します。
private Bitmap mBitmap; private Canvas mCanvas; // 画面変更時 protected void onSizeChanged(int w, int h, int oldw, int oldh){ //キャンバス作成 mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); mCanvas = new Canvas(mBitmap); } // 描画関数 @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(mBitmap, 0, 0, null); }
次に、タッチされた時に配置する画像を読み込む処理。
タッチされた場所に追加する処理を作成します。
private Bitmap stamp_img; // コンストラクタ public SampleView(Context context) { super(context); stamp_img = BitmapFactory.decodeResource( getResources(), R.drawable.ic_launcher ); } // タッチされた時の処理 public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_UP: mCanvas.drawBitmap( stamp_img , x, y, null); invalidate(); break; } return true; }
サンプルプログラム
(importは省略)・Sample20120721Activity.java
public class Sample20120721Activity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout ll = new LinearLayout(this); setContentView(ll); SampleView sv = new SampleView( this ); ll.addView(sv); } }
・SampleView.java
public class SampleView extends View{ private Bitmap mBitmap; private Bitmap stamp_img; private Canvas mCanvas; // コンストラクタ public SampleView(Context context) { super(context); stamp_img = BitmapFactory.decodeResource( getResources(), R.drawable.ic_launcher ); } // 画面変更時 protected void onSizeChanged(int w, int h, int oldw, int oldh){ //キャンバス作成 mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); mCanvas = new Canvas(mBitmap); } // 描画関数 @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(mBitmap, 0, 0, null); } // タッチされた時 public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_UP: mCanvas.drawBitmap( stamp_img , x, y, null); invalidate(); break; } return true; } }
【実行結果】
いつも参考にさせて頂いてます。
ありがとうございます。
タッチして追加したViewを、各々ドラッグして動かすことは可能でしょうか。
色々試しているのですが、連続して追加されたり、動かなかったり悩んでいます。