T012) レイアウト:ボタンでviewの位置を変更する
目的
Viewの配置位置を動的に変更できるようにしたい。
注意点
FrameLayoutを下地として使うと、配置するviewの位置指定はできない。
LinearLayoutを使う。
(RelativeLayoutは非推奨で使えないようだ)
動作
Main.java
package com.example.t012_view_move; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.ViewGroup.MarginLayoutParams; import android.widget.Button; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; public class Main extends Activity { Context context; FrameLayout frame; LinearLayout base; MyView view; int topMargin , leftMargin; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context = getApplicationContext(); frame = new FrameLayout(context); setContentView(frame); topMargin = 0; leftMargin = 0; //base base = new LinearLayout(context); base.setOrientation(LinearLayout.VERTICAL); frame.addView(base); //Widget インスタンス生成 TextView tv = new TextView(context); Button btn = new Button(context); view = new MyView(context); //addView base.addView(tv); base.addView(btn); base.addView(view); tv.setText("この文字はleftMargin:100"); MarginLayoutParams mp = (MarginLayoutParams) tv.getLayoutParams(); mp.leftMargin = 100; tv.setLayoutParams(mp); btn.setText("押すとビューが移動するよ"); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub v.setBackgroundColor(Color.GREEN); topMargin += 100; leftMargin += 100; MarginLayoutParams lp = (MarginLayoutParams)view.getLayoutParams(); // ViewGroup.MarginLayoutParamsでキャストすることで FrameLayoutの子要素であっても同様に扱える。 lp.topMargin = topMargin; lp.leftMargin = leftMargin; view.setLayoutParams(lp); //XXX <--必須。(ないと、1度しか移動しなくなる) Log.v("onClick",""+topMargin); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
MyView.java
package com.example.t012_view_move; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; import android.view.ViewGroup.LayoutParams; public class MyView extends View { public MyView(Context context) { super(context); // TODO Auto-generated constructor stub this.setBackgroundColor(Color.RED); int w = 10, h = 10; LayoutParams params = new LayoutParams(w,h); this.setLayoutParams(params); } @SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); Paint paint = new Paint(); float cx = 5, cy = 5, radius = 10; canvas.drawCircle(cx, cy, radius, paint); } }