たぼさんの部屋

いちょぼとのんびり

T012) レイアウト:ボタンでviewの位置を変更する

目的

Viewの配置位置を動的に変更できるようにしたい。

注意点

FrameLayoutを下地として使うと、配置するviewの位置指定はできない。
LinearLayoutを使う。
(RelativeLayoutは非推奨で使えないようだ)

動作

f:id:donsuka_kk:20121114170440p:plain

f:id:donsuka_kk:20121114170443p:plain

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);
	}
	

}