달력

2

« 2013/2 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 24
  • 25
  • 26
  • 27
  • 28
반응형
728x90
반응형

안드로이드 - 미디어 스캐닝하기

전체 스캐닝 하기
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

원하는 파일만 스캐닝하기
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+ "폴더위치"+"파일이름"+".파일확장자")));

728x90
반응형
:
Posted by mapagilove
728x90
반응형

안드로이드 - C2DM 안드로이드 push 개발설명 & 샘플소스파일  

 

원본출처:http://blog.naver.com/PostView.nhn?blogId=haengro&logNo=40134086859

복사http://blog.naver.com/haengro/40134086859

첨부파일 (3)

 C2DM - Cloud to device message

C2DM(Cloud to device message)을 사용하면, 안드로이드에서도 서비스 없이 푸쉬알림기능을 이용할 수 있습니다.







 C2DM의 사용 순서



C2DM을 사용하기 위해서는 몇가지 단계가 필요합니다.


1. 어플리케이션 등록 및 메일 확인

   - 아래의 페이지에 접속해서 어플리케이션을 등록해야 합니다.

 

    위에서부터 순서대로,, 입력해주시면 됩니다.
    - 어플리케이션 패키지이름 <<-- 정확히! 반드시 정확히 입력
    - 마켓에 등록되어있는지 여부
    - 하루에 어느정도량의 메시지(푸쉬)를 이용할지에 대한 추측
    - 초당 최대 몇번의 쿼리를 요청할지에 대한 추측(QPS)
    - 어플리케이션에 대한 추가 정보

    Contact information 부분에는 자신의 구글계정 메일주소를 입력하면 문제없이 처리됩니다.

    여기까지 이상없이 처리한 후 [Submit] 버튼을 누르고 눈 몇번 깜빡여 주면, 메일이 도착합니다.
    아래와 같은 메일을 수신했다면 C2DM을 사용할 수 있게된 것입니다.
    


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private static void auth()
{
    try
    {
        StringBuffer postDataBuilder = new StringBuffer();
        postDataBuilder.append("Email=" + "개발자이메일주소");
        postDataBuilder.append("&Passwd=" + "개발자이메일암호");
        postDataBuilder.append("&accountType=GOOGLE");
        postDataBuilder.append("&source=" + "어플정보 또는 디바이스 정보");
        postDataBuilder.append("&service=ac2dm");
        byte[] postData = postDataBuilder.toString().getBytes("UTF8");
        URL url = new URL("https://www.google.com/accounts/ClientLogin");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Content-Length", Integer.toString(postData.length));
        OutputStream out = conn.getOutputStream();
        out.write(postData);
        out.close();
        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String inputLine;
        while((inputLine = in.readLine()) != null)
        {
            System.out.println(inputLine);
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}
   

위의 코드를 통해서 AUTH 키를 획득합니다.

이메일주소와 암호를 정확하게 입력해주고, 여러가지 url 등을 입력해 준 후에, 실행을 해서 auth키를 획득하면됩니다. 
&source=androidpush-test. nexusone-2.2 <<-- 
                               이 부분은, 설명같은거라서 꼭 이렇게 쓰지 않아도 됩니다. 개발자가 임의로 작성하면 됩니다.


정상적으로 처리되었다면, 위와 같이 세개의 키를 얻을 수 있습니다. 이 중, Auth 키를 잘 보관해 둡니다.
  

디바이스 인증키를 받기위해서는 BroadcastReceiver를 상속받아서 만든 Receiver가 필요합니다.
그리고 사용자인증을 위한 코드가 필요합니다.
 
리시버(Receiver)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class C2DMReceiver extends BroadcastReceiver
{
    @Override   public void onReceive(Context context, Intent intent)
    {
        Log.e("C2DM", "onReceive");
 
        //서버에 정상적으로 등록이 완료되었을 때
        if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION"))
        {
            handleRegistration(context, intent);
        }
        //서버에서 메시지가 도착했을 때
        else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE"))
        {
            handleMessage(context, intent);
        }
    }
 
    private void handleRegistration(Context context, Intent intent)
    {
        Log.e("C2DM", "handleRegistration");
        //서버에서 넘어오는 메시지의 내용에 key이름 "registration_id"에는 이 기기에만 사용하는 인증키값이 담겨서 넘어온다.
        String registration = intent.getStringExtra("registration_id");
        if (intent.getStringExtra("error") != null)
        {
            Log.e("C2DM", "error");
        }
        else if (intent.getStringExtra("unregistered") != null)
        {
            Log.e("C2DM", "unregistered");
        }
        else if (registration != null)
        {
            Log.e("C2DM", registration);
        }
    }
 
    private void handleMessage(Context context, Intent intent)
    {
        Log.e("C2DM", "handleMessage");
        Toast.makeText(context, intent.getStringExtra("msg"), 1000).show();
    }
}



액티비티(Activity)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class C2DMClientActivity extends Activity implements OnClickListener
{  
    private String mailAddress = "메일주소@gmail.com";
    @Override   public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button btnRegist = (Button)findViewById(R.id.c2dmclient_btnRegist);
        Button btnUnregist = (Button)findViewById(R.id.c2dmclient_btnUnregist);
        btnRegist.setOnClickListener(this);
        btnUnregist.setOnClickListener(this);
         
    }
     
    @Override   public void onClick(View v)
    {
        switch(v.getId())
        {
        case R.id.c2dmclient_btnRegist:
            //Android C2DM에 Push메시지를 받겠다는 메시지를 보내는 Intent
            //정상적으로 등록이되면 Android C2DM Server쪽에서 인증키를 보내준다.
            //이 인증키는 해당 어플리케이션과 해당 기기를 대표하는 인증키로 서버에서 메시지를 보낼 때 사용되며
            //서버에 등록을 할 때마다 인증키는 달라진다.
            Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
            registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
            registrationIntent.putExtra("sender", mailAddress);
            startService(registrationIntent);
            break;
        case R.id.c2dmclient_btnUnregist:
            //Android C2DM에 Push메시지를 그만 받겠다는 메시지를 보내는 Intent
            Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER");
            unregIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
            startService(unregIntent);
            break;
        default:
            break;
        }
    }
}

 



여기에서 리시버는 서버에서 어떤 액션인가를 취해서 디바이스로 정보를 보낼때, 
그 액션이 리시버에 설정되어있는 액션일 경우에 그 액션(이벤트)에 대해서 처리를 할 수 있습니다.

위의 액티비티 소스코드에서 보이는것처럼, 서버에 인증을 요청하면, 서버는 그 내용을 처리해서
디바이스로 메시지를 전달합니다, 

디바이스가 정상적으로 등록이 된 경우 com.google.android.c2dm.intent.REGISTRATION 라는 액션을 취해 메시지를 보내주는 것이고,
푸쉬알림 등의 메시지를 보낼 때는 com.google.android.c2dm.intent.RECEIVE 라는 액션을 취해 메시지를 보내는 것이라고 생각하면 쉽게 이해가 될겁니다.

  
  



4. Manifest.xml 수정
  


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<receiver android:name="C2dmReceiver"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="패키지명" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="패키지명" />
    </intent-filter>
</receiver>
<permission android:name="패키지명.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="패키지명.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />







5. 메시지 보내기


이제 그동안 모은 키들을 가지고 아래와 같이 알림메시지를 cloud로 보낼 수 있습니다.
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public static void androidPush(String regId, String title, String msg) throws Exception
{
    try
    {
        StringBuffer postDataBuilder = new StringBuffer();
 
        // device 인증 키
        postDataBuilder.append("registration_id=" + regId);
        postDataBuilder.append("&collapse_key=1");
        postDataBuilder.append("&delay_while_idle=1");
 
        // message
        postDataBuilder.append("&data.msg=" + URLEncoder.encode(msg, "UTF-8"));
        byte[] postData = postDataBuilder.toString().getBytes("UTF8");
        URL url = new URL(HOST_PUSH);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
        conn.setRequestProperty("Content-Length",Integer.toString(postData.length));
 
        // AUTH 키
        conn.setRequestProperty("Authorization", "GoogleLogin auth="+AUTH);
        OutputStream out = conn.getOutputStream();
        out.write(postData);
        out.close();
        conn.getInputStream();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}


데이터의 전달
- postDataBuilder.append("&data.msg=" + URLEncoder.encode(msg, "UTF-8")); // 내용
- 위의 방식으로 데이터 입력이 가능하고 receiver에서 intent로 가져올 수 있다.
- &data.msg 에서 msg 가 키네임이 된다.
- 데이터를 가져올때는 getIntent().getExtras().getString("msg") 또는 getIntent().getStringExtra("msg") 로 가져올 수 있다.

- C2DM 은 아래와 같이 작동합니다.
  • C2DM 을 사용하기 위해 디바이스 상의 어플리케이션은 우선 구글에 등록해 Registration ID 를 발급 받아야 합니다. 해당 ID 를 자신의 서버에 전달해야 합니다. 
  • 만일 자신의 서버가 푸시하고 싶은 메세지가 있을 경우, 메세지를 HTTP 를 통해 구글의 C2DM 서버에 전달합니다. 
  • C2DM 서버는 메세지를 디바이스에 라우팅 하고, 디바이스는 브로드캐스트 인텐트를 어플리케이션에 전달 할 것 입니다. 
  • 타켓 어플리케이션은 브로드 캐스트 인텐트를 통해 깨어나고 메세지를 처리합니다. 
  • 어플리케이션은 사용자가 더이상 푸시 서비스를 받고싶지 않을 경우 등록을 취소할 수 있습니다. 






 C2DM을 사용해보고...


C2DM을 사용하면 2.2(프로요) 이상의 안드로이드 OS를 사용하는 안드로이드 Device에서,
BroadcastReceiver를 사용하여 Service의 구현없이 푸쉬알림이  가능합니다.
(2.1이하 OS에서는 안된다. 아쉽게도..)

하지만, C2DM을 사용하는 어플리케이션이 모두 동일한 액션을 사용한다고 생각되기 때문에,
여러 어플리케이션중에서 자신의 어플리케이션의 메시지만을 식별해 낼 수 있는 방법이 필요할것입니다.
- 동일한 액션  : com.google.android.c2dm.intent.RECEIVE

C2DM이 구글톡과 연동되어 메시지를 전달한다는 얘기가 있었습니다.
- 넥서스원 2.2에서 확인해보니 구글톡이 로그아웃 되어있는것을 확인하고 푸쉬를 하였지만 제대로 동작하였습니다.
- 다른 기기에서는 미확인, 확인요

데이터를 전달하는 방식이 intent에 bundle로 넘기는 방식을 취하기 때문에 키값을 적절히 지정해 사용한다면,
자신의 어플리케이션을 식별해 내는 것에는 문제가 없다고 생각됩니다.

또, 디바이스 인증 키(디바이스 식별 ID)는 각 디바이스에서만 알 수 있기 때문에,
어플리케이션에서 푸쉬알림을 받겠다는 명령을 실행했을 때, 이 식별 ID를 서버단으로 넘겨주는 부분이 있어야 합니다.
서버에서 이 키들을 모아서 DB에 저장해 놓고 사용한다면 푸쉬알림에 문제는 없을듯합니다.

참조 : http://croute.me/331
 
위 내용을 토대로 샘플소스를 만들어봤는데 소스파일은 첨부파일로 올려두었다.


 

728x90
반응형
:
Posted by mapagilove
728x90
반응형

안드로이드 - 버튼 클린 효과 주기

 

원본출처:http://ishyeok.tistory.com/m/post/view/id/28

iOS에의 경우에는 간단하게 XiB 파일에서 선택 시, 눌려졌을 때, 하이라이트 색상 등이 쉽게 지정이 가능하지만, 안드로이드의 경우에선 레이아웃 xml 파일에서는 따로 지정할 곳이 없다.


이럴 땐 간단하게,

res/drawable폴더 생성 후 안에 button_state.xml (이름은 자유)로 만든 후 내용은,


<?xml version="1.0" encoding="utf-8"?>

<selectorxmlns:android="http://schemas.android.com/apk/res/android">


<item android:drawable="@color/bg_side_menu_onclick" android:state_pressed="true"/>

<item android:drawable="@color/bg_side_menu_onclick" android:state_focused="true"/>

<item android:drawable="@color/bg_side_menu_normal"/>


</selector>


로 파일을 생성한다. 말 그대로 android:state 부분이 클릭이 되었을 때 부분이다.

윗 파일은 color를 따로 만들어서 사용을 했지만, 이미지파일이 있다면, 이미지를 넣어줘도 무방하다.

위와 같은 파일을 생성 후에는,


<Button

android:background="@drawable/button_state">


라는 속성을 추가하면 버튼 클릭 에 따른 효과가 주어진다.

 

728x90
반응형
:
Posted by mapagilove
728x90
반응형
댓글쓰기


이미지를 이용하여 움직이고 이벤트 발생하고 등을 구현합니다.
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RatingBar;

public class MyView extends View{
	int width,height; //화면의 폭과 높이
	Bitmap back1,back2; //화면에 표시할 이미지
	//버튼의 색 상태값을 정할 상수
	final int NORMAL_STATE=0;
	final int PUSH_STATE=1;
	int state; //상태값을 저장할 변수
	//버튼이 차지하고 있는 영역을 표시할 변수
	int btn_minX,btn_maxX,btn_minY,btn_maxY;
	//버튼이 차지하고 있는 영역을 표시할 사각형 객체
	Rect rectBtn;
	Bitmap pin; //바늘의 이미지
	int pinW,pinH;//핀 이미지의 폭과 높이
	float scaleRatioX,scaleRatioY; //이미지 확대축소 비율
	int originalBackX,originalBackY; //원본배경이미지의 크기
	int originalPinX,originalPinY; //원본 핀의 크기
	int dialX,dialY;//핀을 위치시킬 좌표
	int angle; //캔바스의 현재 돌아간 각도
	int angleSpeed=10;//캔바스의를 돌리는 각속도
	//생성자
	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		//화면에 표시할 이미지를 읽어온다.
		back1=BitmapFactory.decodeResource(getResources(),
				R.drawable.back1);
		back2=BitmapFactory.decodeResource(getResources(),
				R.drawable.back2);
		pin=BitmapFactory.decodeResource(getResources(),
				R.drawable.pin);
		//핸들러를 호출해서 화면이 지속적으로 갱신되도록한다.
		handler.sendEmptyMessage(0);
		//원본 배경이미지의 크기 구하기
		originalBackX=back1.getWidth(); //이미지의 폭
		originalBackY=back1.getHeight(); //이미지의 높이
		//원본 핀 이미지의 크기 구하기
		originalPinX=pin.getWidth();
		originalPinY=pin.getHeight();
	}
//	
//	  	 [[ onDraw()메소드 ]] 
//	  
//	 	- 화면을 처음 구성할때 한번 호출되어서 화면에 무언가를 그린다.
//	 	- invalidate() 메소드를 호출하면 화면이 무효화 되고 다시 그리기
//	 	    위해서 다시 한번 호출된다.
//	 
	public void onDraw(Canvas canvas){
		//현재 상태에 따라서 다른 이미지를 그린다.
		switch(state){
		case NORMAL_STATE: //누르지 않은 상태 일때
			//이미지를 화면에 그린다
			canvas.drawBitmap(back1, 0, 0, null);
			break;
		case PUSH_STATE: //누르고 있는 상태 일때
			//이미지를 화면에 그린다
			canvas.drawBitmap(back2, 0, 0, null);
			break;
		}
		//캔바스 회전 시키기
		canvas.rotate(angle, dialX, dialY);
		canvas.drawBitmap(pin, dialX-pinW/2 ,//핀의 x 좌표
							dialY-pinH+(int)(pinH/4.8), //핀의 y 좌표
							null); 
		
	}
	//캔바스 회전 시키는 메소드
	public void rotateCanvas(){
		angle += angleSpeed ; //각속도 만큼 캔바스를 회전 시킨다
		if( angle >= 90 || angle <= -90)
			angleSpeed *= -1 ; //부호를 바꾸어서 반대로 회전하게한다.
	}
	//View 가 실제로 차지하고 있는 크기에 대한 정보가 들어온다.
	protected void onSizeChanged
		(int w, int h, int oldw, int oldh) {
		//화면의 폭과 높이 필드에 저장하기
		width = w;
		height = h;
		
		Log.e("#####","onSizeChanged()");
		//이미지 축소 비율구하기
		scaleRatioX = w / (originalBackX * 1.0f) ;
		scaleRatioY = h / (originalBackY * 1.0f) ;
		
		//화면의 크기에 맞게 이미지의 크기를 스케일하기
		back1=Bitmap.createScaledBitmap(back1, w, h, false);
		back2=Bitmap.createScaledBitmap(back2, w, h, false);
		//배경이 줄어든만큼 바늘의 크기도 같은 비율로 줄이기
		pinW = (int)(originalPinX * scaleRatioX); 
		pinH = (int)(originalPinY * scaleRatioY); 
		pin = Bitmap.createScaledBitmap(pin, pinW, pinH, false);
		
		btn_minX=w/3;
		btn_maxX=2*w/3;
		btn_minY=h-h/10;
		btn_maxY=h;
		
		//사각형 객체 생성하기
		rectBtn=new Rect(btn_minX,btn_minY,btn_maxX,btn_maxY);
		//핀을 위치 시킬 좌표 구하기
		dialX = w / 2;
		dialY = ( h / 3) * 2;
		
	};
	//터치 입력을 받기 위해서
	public boolean onTouchEvent(MotionEvent event) {
		//터치한 곳의 좌표를 읽어오기.
		int touchedX=(int)event.getX();
		int touchedY=(int)event.getY();
		
		switch(event.getAction()){
		case MotionEvent.ACTION_DOWN: //액션 다운 이벤트가 발생했을때
			/*
			if(touchedX > btn_minX && touchedX < btn_maxX &&
			   touchedY > btn_minY && touchedY < btn_maxY){
				state=PUSH_STATE; //상태값을 바꿔준다.
			}
			*/
			
			//Rect객체를 이용한다면
			if(rectBtn.contains(touchedX, touchedY)){
				state=PUSH_STATE; //상태값을 바꿔준다.
			
			}
			break;
		case MotionEvent.ACTION_UP: //액션 업 이벤트가 일어났을때
			state=NORMAL_STATE;
			break;
		}
		
		return true; //ACTION_MOVE, ACTION_UP 이벤트도 받기 위해서
	};
	
	
	//지속적인 화면 갱신을 위해서 핸들러에서 화면을 무한루프 돌면서 갱신하게 한다.
	Handler handler=new Handler(){
		public void handleMessage(android.os.Message msg) {
			//화면 갱신한다.
			invalidate();
			if(state != PUSH_STATE){ //버튼을 누르고 있는 상태가 아닐때
				//핀을 움직이게 하기 위해서
				rotateCanvas();
			}
			// 10 / 1000 초마다 자신의 객체를 재귀호출한다.(무한루프)
			handler.sendEmptyMessageDelayed(0, 10);
			
		}
	};
	
}
 
 

 

728x90
반응형
:
Posted by mapagilove
728x90
반응형
안드로이드 - 사진촬영 후 사진과 포토앨범 가져오기

 

원본출처:http://thdev.net/m/post/view/id/214

Android에서 촬영한 사진과 포토앨범에서 사진을 가지고 오는 코드입니다.

이미 예전에 작성 해둔 코드인데 4.0.3 버전으로 수정하였습니다. 사실상 기존 코드와의 차이는 별로 없이 잘 동작합니다.

아래 코드는 제가 연습용으로 작성 한 코드이기에 정확하지 않을 수 있습니다. 참고용으로 활용하세요.


결과 화면

 메인 화면 사진 가져오기 버튼을 두었습니다.


커스텀 뷰를 이용하여 카메라 촬영하기 위한 버튼과 포토 앨범을 접근하기 위한 메뉴를 제작하였습니다.


카메라로 촬영한 후 가져온 사진입니다.


포토앨범에서 선택한 사진을 불러온 결과화면 입니다.


프로젝트 생성하는 방법은 아래 더보기를 열어보세요.

더보기


소스코드 다운로드

  http://db.tt/kIjrVumT

728x90
반응형
:
Posted by mapagilove
728x90
반응형


안드로이드 - 동적으로 버튼 생성하기

원본출처:http://redhan.tistory.com/40
주로 디버깅을하기위해서 버튼을 이용하여 다양한 테스트를 할 필요가 있을때 사용한다.

RelativeLayout navigateLayout = (RelativeLayout)findViewById(R.id.navigatelayout);

Button btnOn=new Button(this);
btnOn.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
         // TODO Auto-generated method stub
         offRouteFlash.startAnimation();
    }
});
btnOn.setText("on");
btnOn.setMinimumHeight(150);
btnOn.setMinimumWidth(100);
navigateLayout.addView(btnOn);

Button btnOff=new Button(this);
btnOff.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
         // TODO Auto-generated method stub
        offRouteFlash.stopAnimation();
    }
});       
btnOff.setText("off");
btnOff.setMinimumHeight(150);
btnOff.setMinimumWidth(100);
navigateLayout.addView(btnOff);
   
RelativeLayout.LayoutParams paramsOn;
paramsOn = (RelativeLayout.LayoutParams)btnOn.getLayoutParams();
paramsOn.leftMargin = paramsOn.leftMargin + 100;
btnOn.setLayoutParams(paramsOn);

RelativeLayout.LayoutParams paramsOff;
paramsOff = (RelativeLayout.LayoutParams)btnOff.getLayoutParams();
paramsOff.leftMargin = paramsOff.leftMargin + 200;
btnOff.setLayoutParams(paramsOff);

728x90
반응형
:
Posted by mapagilove
반응형