<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ToggleButton
        android:id="@+id/toggleButton01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/btn_default"
        android:textOff="Off Stage"
        android:textOn="On Stage" />

</LinearLayout>
package com.button;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ToggleButton;

public class ButtonActivity extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		final ToggleButton tb = 
				(ToggleButton)this.findViewById(R.id.toggleButton01);

		tb.setOnClickListener(new View.OnClickListener() { 
			public void onClick(View v) { 
				if (tb.isChecked()) { 
					tb.setBackgroundDrawable(getResources().
							getDrawable(R.drawable.btn_press)); 
				} else { 
					tb.setBackgroundDrawable(getResources().
							getDrawable(R.drawable.btn_select)); 
				}
			} 
		});
	}
}




'Android > 기본' 카테고리의 다른 글

버튼클릭 제스쳐, 상태에 따른 버튼이미지 변경, xml 파일로 만들기  (0) 2012.05.15
Eclipse Phone test  (0) 2012.05.14
Android 9 patch  (0) 2012.05.14
예비  (0) 2012.04.28
Android 메인로딩 페이지 만들기  (0) 2012.04.28

버튼에 대한 상태를 생각해봅시다.
여러가지의 상태가 있는데 그 여러 상태에 대해서 버튼에 다른이미지를 보여줄 수 있습니다.

버튼의 상태
 default   아무것도 아닌 상태 
 pressed     누르고 있는 상태 
 focused   누르고 있진 않았지만 포커스가 주어진 상태 
 selected   선택된 상태  

이렇게 네가지의 상태가 있습니다.
이 네가지 상태에 대해서 각각 다른 이미지를 보여주기 위해서는 네가지의 이미지가 있어야 합니다.

저는 보통 3가지의 이미지를 두고, 
default, pressed, focused 또는 
default, pressed, selected 에 사용합니다.



이미지 파일을 준비합니다.
이미지들은 res 소스에 넣어 줍시다.

res/drawable/button_change.xml
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" 
        android:drawable="@drawable/btn_press" /> <!-- pressed -->
    
    <item android:state_selected="true" 
        android:drawable="@drawable/btn_select" /> <!-- selected -->
    
    <item android:drawable="@drawable/btn_default" /> <!-- default -->
</selector>

main.xml
<ImageButton
    android:id="@+id/main_btn_change"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/button_change"
/>


ButtonActivity.java
package com.button;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
 
public class ButtonActivity extends Activity implements OnClickListener 
{
    ImageButton btn_change;
     
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         
        btn_change = (ImageButton)findViewById(R.id.main_btn_change);
        btn_change.setOnClickListener(this);
    }
 
    @Override
    public void onClick(View v)
    {
        switch(v.getId())
        {
        case R.id.main_btn_change :
            btn_change.setSelected(true);
            break;
        }
    }
}


출처:http://croute.me/288

'Android > 기본' 카테고리의 다른 글

ToggleButton이 ON/OFF 될 때 버튼의 이미지를 변경하는 예제  (0) 2012.05.15
Eclipse Phone test  (0) 2012.05.14
Android 9 patch  (0) 2012.05.14
예비  (0) 2012.04.28
Android 메인로딩 페이지 만들기  (0) 2012.04.28

만들어진 앱은 AVD가 아닌 실제 휴대폰에서 잘 동작해야 합니다. 이번 포스트에서는 이클립스로 만든 앱을 실제 기기에 설치하고 실행하는 방법에 대해 안내 드립니다.

 

 

휴대폰 설정 

휴대폰으로 앱을 설치하기 위해서는 먼저 설정해야 하는 것이 있습니다. 아래와 같이 실행해 주세요. 

 

1. 안드로이드의 홈 스크린(바탕화면)에서 메뉴 버튼을 누르면, '설정'이라는 항목이 있습니다. 그것을 선택하세요.

 

2. 설정 메뉴에서 애플리케이션을 선택하세요.

 

3. 애플리케이션 설정에서 '개발'을 선택하세요.

 

4. 개발 메뉴에서 'USB 디버깅'을 체크하세요. USB 디버깅을 사용할지를 묻는 팝업이 뜹니다. '확인' 버튼을 클릭해 주세요.

 

 

휴대폰으로 앱을 실행하기 위한 과정

우리가 이클립스를 처음 사용했을 때에는 AVD가 작동할 수 있도록 AVD 매니저를 활용했었습니다. 그것이 아닌 실제 기기에 앱이 작동되려면, 우리는 별도의 설정을 추가로 해줘야 합니다.

 

1. 메뉴 Run - Run Configurations...를 선택하세요. 아래 그림을 참고하시기 바랍니다.




2. Run Configurations 창이 뜹니다. 여기에는 아래 그림과 같이 Android, Target, Common 탭들이 보입니다. 그 중 Target을 선택하세요. Deployment Target Selection Mode가 보일 것입니다. 그것을 Manual로 변경해 주세요. 이것은 이클립스가 앱을 실행시킬 때 AVD와 실제 기기(들) 중 어떤 것을 선택할지를 물어보겠다는 의미입니다. 변경 후 Apply 버튼을 클릭하시고, Run 버튼을 클릭하세요.



3. 여러분께서 가지고 있는 안드로이드 휴대폰을 PC에 연결하세요.



4. 이제 앱을 실행하는 메뉴 Run As - Android Application을 선택하세요. 그러면 이클립스는 아래 그림과 같이 Android Device Chooser 창을 띄웁니다. 여기에서 우리는 AVD와 실제 기기 중 하나를 선택할 수 있습니다. AVD의 시리얼 번호는 'emulator'로 시작합니다. 실제 기기에 앱을 실행하려면 다른 번호(아래 그림에서는 1234567890ABCDEF)를 선택해야겠지요? 실제 기기의 시리얼 번호를 선택하신 후 OK 버튼을 클릭하세요.



참고로 위 그림에서 실제 기기의 현재 OS 버전은 2.2.2입니다. 버전 왼쪽에 빨간 X표가 그려져 있네요. 그 이유는 제가 만든 프로젝트의 타겟 버전을 2.2.2보다 상위 버전(4.0을 선택했습니다. 아이스크림 샌드위치죠.)으로 선택했기 때문입니다. 빨간 X표는 앱이 실행될 타겟이 하위 버전이므로 그것이 실행되지 못할 수 있음을 의미합니다. 그러나 저는 이 프로젝트의 Min SDK version을 8로 지정했습니다. 이것은 바로 프로요의 API 레벨이죠. 따라서 이 프로젝트로부터 생성된 앱은 프로요 기기에서도 실행 가능합니다.
 
5. 잠시만 기다려 주시면 여러분의 폰에서 앱이 실행됩니다. 확인해 보세요.




요번 포스트는 안드로이드를 

좀 더 아이폰 스타일의 텍스트뷰(에디터뷰)를 만들어보겠습니다.

위에서는 아이폰의 "X" 버튼을 만들어보았는데, 

나인패치를 이용하여 전 포스트를 아이폰과 비슷한 아래의 모양 처럼 만들어보겠습니다. 



나인패치란 쉽게 말해서 기존의 이미지 PNG 파일에 1px의 테두리를 두고, 

늘어나는 곳와 내용이 출력되도록 하는 것입니다. 

즉, 뷰의 크기에 따라 이미지의 크기가 자동으로 조절 되는 것을 말합니다.. 

파일 이름은 반드시 *.9.png 로 해야. 나인패치를 적용할 수 있습니다. 

나인패치를 하기 위해

두개의 이미지를 준비를 했습니다. 



ic_btn_serach_selected.png
  
 

ic_btn_serach_selected.png
  
 



나인패치프로그램은 안드로이드sdk 설치된 곳에 

tools폴더에 보면 draw9patch.bat를 실행 시키면 검은 cmd창이 뜨는데, 종료를 하시면 프로그램이 꺼져버리니 그냥둡니다. 


cmd창이 자동으로 종료가 될 경우 아래의 파일을 안드로이드sdk폴더 안에 tools 폴더에 있는 lib 폴더에 넣어줍니다. 

tools/lib


이제 위에서 받은 이미지를 드래그해서 창위에 올려 놓아 이미지를 불러옵니다. 



이미지를 불러오면 위에와 같이 원본 파일 테두리에 1px의 여백이 나타나는데, 이곳에 표시를 하여, 

늘어나는 곳을 정해주면됩니다. 

왼쪽과 상단은 stretchable area를, 오른쪽과 하단은 padding box의 위치를 정해줍니다. 






다음과 같이 검은색으로 표시된 곳이 나인패치를 정해준 곳입니다. 

상하의 모양을 유지하기 위해서 왼쪽 여백은 다 칠했고, 

좌우는 view의 모양에 따라 크기가 자동으로 변하게 하기 위하여 늘어나는 공간을 표시했습니다. 

하단과 우측의 경우 view의 크기에 따른 글씨의 크기 텍스트가 표시될 위치(?)를 나타냅니다. 

이렇게 ic_btn_serach_selected.png와 ic_btn_serach_unselected.png 파일을 동일하게 편집하고 9.png파일로 저장을 합니다. 

저장한 파일을 drawable 폴더에 넣고, xml파일을 수정하면 됩니다. 


main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:paddingTop="0px" >

        <EditText
            android:id="@+id/address"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/ic_btn_serach_unselected"
            android:hint="Search"
            android:inputType="textUri"
            android:maxLength="14"
            android:singleLine="true" />

        <ImageButton
            android:id="@+id/clear_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginRight="10dip"
            android:layout_marginTop="10dip"
            android:background="@drawable/ic_btn_serach_selected"
            android:visibility="invisible" />
    </RelativeLayout>

</LinearLayout>



NinePatchActivity.java
package com.gusfree.nine;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.EditText;
import android.widget.ImageButton;

public class NinePatchActivity extends Activity {

	EditText et;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		et=(EditText) findViewById(R.id.address);
		
		
		et.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				
				if(event.getAction()== MotionEvent.ACTION_DOWN){
				et.setBackgroundDrawable(getResources().
						getDrawable(R.drawable.ic_btn_serach_selected));

			}
			else if(event.getAction() == MotionEvent.ACTION_UP){
				et.setBackgroundDrawable(getResources().
						getDrawable(R.drawable.ic_btn_serach_unselected));

			}
			return false;
			}

		});
	}
}



'Android > 기본' 카테고리의 다른 글

Eclipse Phone test  (0) 2012.05.14
Android 9 patch  (0) 2012.05.14
Android 메인로딩 페이지 만들기  (0) 2012.04.28
Android 카메라, 인증키(키스토어)  (0) 2012.04.28
Android surface(마우스에 이미지 따라다니기)  (0) 2012.04.28
res/ layout/ main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>


res/ layout/ splash.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/intro_black"
    android:gravity="center_vertical|center_horizontal"
    android:orientation="vertical" >

   <!--  
   <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="loading..."
        android:textSize="20sp"
        android:textStyle="bold" >
    </TextView>
    -->
</LinearLayout>


package kr.android.vichara;
//시작되는 & 로딩페이지(로딩페이지를 호출함)
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Window;

public class MainActivity extends Activity{
	@Override
	public void onCreate(Bundle savedInstanceState){
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		super.onCreate(savedInstanceState);
		setContentView(R.layout.splash);//로딩 이미지 있는곳

		initialize();
	}

	private void initialize(){
		Handler handler =    new Handler(){
			@Override
			public void handleMessage(Message msg){
				finish();    // 액티비티 종료
				startActivity(new Intent(MainActivity.this, SplashActivity.class));//이동될 클래스
			}
		};
		handler.sendEmptyMessageDelayed(0, 3000);    // ms, 3초후 종료시킴
	}
}


package kr.android.vichara;
//이동되는곳
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class SplashActivity extends Activity{
	@Override
	public void onCreate(Bundle savedInstanceState){
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);//로딩후 보여질페이지


		initialize();  // 시간이 걸리는 작업 처리
	}

	//스플래시 표시하는 것과 초기화를 동시에 진행시키기 위하여 쓰레드 처리
	private void initialize(){
		InitializationRunnable init = new InitializationRunnable();
		new Thread(init).start();
	}

	//초기화
	class InitializationRunnable implements Runnable{
		public void run(){
			// 여기서부터 초기화 작업 처리
			// do_something
		}
	}
}




'Android > 기본' 카테고리의 다른 글

Android 9 patch  (0) 2012.05.14
예비  (0) 2012.04.28
Android 카메라, 인증키(키스토어)  (0) 2012.04.28
Android surface(마우스에 이미지 따라다니기)  (0) 2012.04.28
Android Video View (동영상 재생)  (0) 2012.04.28

카메라 권한 , sd 쓰기 권한










인증키 만들기

:팩키지명 안겹치게.
:인증키 잃어버리지 말기.
:인증키 유효기간 넉넉하게 1000년







업데이트하기







스크린캡쳐









package net.npaka.cameraex;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class CameraEx extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(new CameraView(this));
	}
}


package net.npaka.cameraex;

import android.content.Context;
import android.hardware.Camera;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.FileOutputStream;

//카메라제어
public class CameraView extends SurfaceView implements 
                 SurfaceHolder.Callback,Camera.PictureCallback{
	private SurfaceHolder holder; //홀더
	private Camera camera;//카메라

	//생성자
	public CameraView(Context context){
		super(context);

		//표면 홀더 생성 
		holder=getHolder();
		holder.addCallback(this);
		//푸쉬 버퍼 지정(1)
		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}

	//표면생성 이벤트의 처리
	public void surfaceCreated(SurfaceHolder holder){
		//카메라 초기화 (2)
		try{
			camera=Camera.open();
			camera.setPreviewDisplay(holder);
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	//표면 변경 이벤트 처리
	public void surfaceChanged(SurfaceHolder holder, int format,int w, int h){
		//카메라 미리보기 시작(3)
		camera.startPreview();
	}

	//표면 파괴 이벤트 처리
	public void surfaceDestroyed(SurfaceHolder holder){
		//카메라 미리보기 정지(4)
		camera.setPreviewCallback(null);
		camera.stopPreview();
		camera.release();
		camera=null;
	}

	// 터치 이벤트 처리
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() ==MotionEvent.ACTION_DOWN) {
			// 카메라 스크린 샷 구하기 (5)
			camera.takePicture(null,null,this);
		}
		return true;
	}

	// 사진 촬영 완료 시 불린다.
	public void onPictureTaken(byte[] data,Camera camera) {
		// 파일 보존과 갤러리로의 등록
		try {
			data2sd(getContext(),data,"test.jpg");
		} catch (Exception e) {
			android.util.Log.e("",""+e.toString());
		}

		// 미리보기 재개
		camera.startPreview();
	}

	// 바이트 데이터→SD 카드
	private static void data2sd(Context context,
			byte[] w,String fileName) throws Exception {
		// SD 카드에 데이터 저장 (6)
		FileOutputStream fos=null;
		try {
			fos=new FileOutputStream("/sdcard/"+fileName);
			fos.write(w);
			fos.close();
		} catch (Exception e) {
			if (fos!=null) fos.close();
			throw e;
		}
	}
}





'Android > 기본' 카테고리의 다른 글

예비  (0) 2012.04.28
Android 메인로딩 페이지 만들기  (0) 2012.04.28
Android surface(마우스에 이미지 따라다니기)  (0) 2012.04.28
Android Video View (동영상 재생)  (0) 2012.04.28
Android Audio사용 (음악 재생)  (0) 2012.04.28
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>


MainAct
package aa.surface_ex1;

import android.app.Activity;
import android.os.Bundle;

public class MainAct extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MySurfaceView(this));
    }
}


MySurfaceView
package aa.surface_ex1;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Point;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.graphics.Canvas;
import android.view.SurfaceHolder.Callback;

/*
View 에 동영상 또는 카메라 프리뷰와 같이 빠른 화면 변화 또는
그러지는 양이 많을 경우 SurfaceView를 사용해 처리
Surface 는 그래픽 버퍼
Surfaceview 에서 화면 제어를 하기 위해 SurfaceHolder 생성


=-=-=-=--=-=-=-=-=-=-==-=-=-=
		Surface View
=-=-=-=--=-=-=-=-=-=-==-=-=-=
			Surface
=-=-=-=--=-=-=-=-=-=-==-=-=-=
		SurfaceHolder
		
SurfaceHolder를 이용해서 surface(버퍼)에 그림을 그리면 SurfaceView에 반영

*/

public class MySurfaceView extends SurfaceView{
	Bitmap imgMove;
	int moveX,moveY,imgW,imgH;
	Thread thread;
	Point pImage;
	boolean bMove = true;
	SurfaceHolder holder; //canvas의 주체

	public MySurfaceView(Context context) {
		super(context);
		/*SurfaceHolder 주요 메소드
		addCallBack(); 구현한 Callback 객체 등록
		lookccanvas() : Surface를 잠그고 그리기 위한
						Canvas를 반환
		unlockCanvasAndPost() : Canvas lock을 풀고 현재 이미지를 렌더링
		*/

		holder = getHolder(); //SurfaceHolder 객체 반환
		holder.addCallback(callback);
		setFocusable(true);
	}
	/*Surface에 변동사항을 전달할 객체
	Callback Interface는 SurfaceHolder를 통해 작성한
	Surface와 SurfaceView를 연결하기 위해서 Surfcae의 생성,변경 종료에 대한 이벤트 처리
	*/
	private SurfaceHolder.Callback callback = new Callback(){
		//Surface가 파괴되었을때
		public void surfaceDestroyed(SurfaceHolder holder){
			Log.i("MySurfaceView", "표면 파괴");
			bMove = false;
			thread = null;
		}
		public void surfaceCreated(SurfaceHolder holder){
			Log.i("MySurfaceView", "표면 생성");
			pImage = new Point(0,0);

			Resources resources = getResources();
			Bitmap temp_bitmap = BitmapFactory.decodeResource(resources, R.drawable.popeye);

			imgW = 150;
			imgH = 180;
			moveX = 200;
			moveY = 200;

			imgMove = Bitmap.createScaledBitmap(temp_bitmap,imgW,imgW,false);
			setClickable(true);
			thread = new Thread(runnable);
			thread.start();
		}
		//Surface가 변경되었을때
		public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){
			Log.i("MySurfaceView", "표면 변경");
		}
	};
	private Runnable runnable = new Runnable() {

		public void run() {
			while(bMove){
				Canvas c = null;
				try {
					c = holder.lockCanvas();
					synchronized (holder) {
						doDraw(c);
					}
				} catch (Exception e) {
					Log.i("disp", "err : " + e.getMessage());
				} finally{
					if(c != null) holder.unlockCanvasAndPost(c);
				}
			}
		}
	};

	private void doDraw(Canvas canvas){
		pImage.x = moveX;
		pImage.y = moveY;
		canvas.drawColor(Color.WHITE);
		canvas.drawBitmap(imgMove, pImage.x,pImage.y, null);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		int action = event.getAction();

		//touch 지점의 좌표
		int x = (int)event.getX();
		int y = (int)event.getY();

		switch (action) {
		case MotionEvent.ACTION_MOVE:
			moveX = x;
			moveY = y;
			break;
		}
		return super.onTouchEvent(event);
	}
}


마우스에 이미지가 따라 다님



'Android > 기본' 카테고리의 다른 글

Android 메인로딩 페이지 만들기  (0) 2012.04.28
Android 카메라, 인증키(키스토어)  (0) 2012.04.28
Android Video View (동영상 재생)  (0) 2012.04.28
Android Audio사용 (음악 재생)  (0) 2012.04.28
Android Constants Provider  (0) 2012.04.28

파일위치



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <VideoView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/videoView" />

</LinearLayout>


package net.npaka.videoviewex;

import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.widget.VideoView;
import android.widget.MediaController;
import java.io.InputStream;
import java.io.OutputStream;

//동영상 재생
public class VideoViewEx extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		//비디오 뷰의 생성(1)
		VideoView videoView = (VideoView)this.findViewById(R.id.videoView);
		videoView.requestFocus();
		videoView.setMediaController(new MediaController(this));

		try{
			/*  case1  */
			//videoView.setVideoPath("/sdcard/be_my_baby5.mp4");

			/*  case2  */
			//videoView.setVideoURI(
			//		Uri.parse("http://192.168.200.105:8080/web/be_my_baby5.mp4"));

			/* case 3 */
			//Raw 자원의 파일 저장(2)
			raw2file(this,R.raw.be_my_baby5,"be_my_baby5.mp4");

			//동영ㅇ상의 재생 (3)
			String path = getFilesDir().getAbsolutePath()+"/be_my_baby5.mp4";
			videoView.setVideoPath(path);
			videoView.start();

		}catch(Exception e){
			android.util.Log.e("", e.toString());
		}
	}
	// Raw 자원의 파일 보존
	private void raw2file(Context context,
			int resID,String fileName) throws Exception {
		InputStream in=context.getResources().openRawResource(resID);
		in2file(context,in,fileName);
	}

	// 입력 스트림의 파일 보존
	private void in2file(Context context,
			InputStream in,String fileName)
					throws Exception {
		int size;
		byte[] w=new byte[1024];
		OutputStream out=null;
		try {
			out=context.openFileOutput(fileName,Context.MODE_WORLD_READABLE);
			while (true) {
				size=in.read(w);
				if (size<=0) break;
				out.write(w,0,size);
			};  
			out.close();
			in.close();
		} catch (Exception e) {
			try {
				if (in !=null) in.close();
				if (out!=null) out.close();
			} catch (Exception e2) {
			}
			throw e;
		}
	}  
}



실행화면 (에뮬레이터 에선 원활히 구동되지 않습니다)




음악파일 위치


<?xml version="1.0"  encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/startPlayerBtn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="오디오 재생 시작" />

    <Button
        android:id="@+id/restartPlayerBtn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="재생 재개" />

    <Button
        android:id="@+id/pausePlayerBtn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="재생 일시중지" />

</LinearLayout>


package com.proandroid;

import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class SimpleAudio extends Activity {
	static final String AUDIO_PATH = "http://211.183.2.90/web/upload/the_boys.mp3";
	
	private MediaPlayer mediaPlayer;
	private int playbackPosition=0;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button startPlayerBtn = (Button)findViewById(R.id.startPlayerBtn);
        Button pausePlayerBtn = (Button)findViewById(R.id.pausePlayerBtn);
        Button restartPlayerBtn = (Button)findViewById(R.id.restartPlayerBtn);
        
        startPlayerBtn.setOnClickListener(new OnClickListener(){
        	
        	public void onClick(View view){
        		try{
        			playLocalAudio();
        			//playAudio(AUDIO_PATH);
        			//playSdcardAudio();
        			//playLocalAudio_UsingDescriptor();
        		}catch(Exception e){
        			e.printStackTrace();
        		}
        	}
        });
       
        pausePlayerBtn.setOnClickListener(new OnClickListener(){
        	public void onClick(View view){
        		if(mediaPlayer!=null){
        			//음악을 일시 정지 시킬때 정지되기 직전의 position값 저장
        			playbackPosition = mediaPlayer.getCurrentPosition();
        			//일시정지
        			mediaPlayer.pause();
        		}
        	}
        });
        
        restartPlayerBtn.setOnClickListener(new OnClickListener(){
        	public void onClick(View view){
        		//MediaPlayer 객체가 존재하고 현재 실행중이 아닐때
        		if(mediaPlayer!=null && !mediaPlayer.isPlaying()){
        			//음악이 일시정지되기 직전의 position값으로 셋팅
        			mediaPlayer.seekTo(playbackPosition);
        			mediaPlayer.start();
        		}
        	}
        });
    } 
    
    private void playLocalAudio()throws Exception{
    	//어플리케이션에 내장되 있는 자원을 호출해서 MediaPlayer객체 생성
    	mediaPlayer=MediaPlayer.create(this, R.raw.the_boys);
    	//MediaPlayer 객체가 가지고 있는 음악 정보를 start
    	mediaPlayer.start();
    }
    private void  playAudio(String url)throws  Exception{
		killMediaPlayer();

		mediaPlayer = new MediaPlayer();
		mediaPlayer.setDataSource(url);
		mediaPlayer.prepare();
		mediaPlayer.start();
	}	
	private void playSdcardAudio()throws Exception{
		mediaPlayer = new MediaPlayer();
		mediaPlayer.setDataSource("/sdcard/twoneone.mp3");
		mediaPlayer.prepare();
		mediaPlayer.start();
	}
	private void playLocalAudio_UsingDescriptor() throws Exception {

		AssetFileDescriptor fileDesc = 
				getResources().openRawResourceFd(R.raw.twoneone);
		if(fileDesc!=null){
			mediaPlayer=new MediaPlayer();
			mediaPlayer.setDataSource(
					fileDesc.getFileDescriptor(), 
					fileDesc.getStartOffset(),
					fileDesc.getLength());
			mediaPlayer.prepare();
			mediaPlayer.start();
			fileDesc.close();
		}
	}
    
    @Override
    protected void onDestroy(){
    	super.onDestroy();
    	killMediaPlayer();
    }

	private void killMediaPlayer() {
		if(mediaPlayer!=null){
			try{
				//MediaPlayer 자원해제
				mediaPlayer.release();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		
	}
}







Java File



Application -> ADD -> Provider

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="DB정보가 셋팅되었습니다." />

</LinearLayout>


main activity
package dr.android.contents;

import android.app.Activity;
import android.os.Bundle;

public class ConstantsOne extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}


Provider
package dr.android.contents;

import java.util.HashMap;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.hardware.SensorManager;
import android.net.Uri;
import android.provider.BaseColumns;
import android.text.TextUtils;
import android.util.Log;

public class Provider extends ContentProvider{
	//DB명
	private static final String DATABASE_NAME ="constants.db";
	//테이블 명
	private static final String TABLE_NAME = "constants";
	//URI중 고유이름 지정
	private static final String AUTHORITY = "dr.android.contents.Provider";
	//집합데이터와 개별 데이터 구별을 위한 상수 지정
	private static final int CONSTANTS =1;
	private static final int CONSTANT_ID=2;
	//URI 정보를 갖는 객체 선언
	private static final UriMatcher MATCHER;
	//마임타입 지정 (집합데이터/개별데이터)
	private static final String COLLECTION_TYPE = 
			"vnd.android.cursor.dir/vnd.commonsware.constant";
	private static final String SINGLE_TYPE = 
			"vnd.android.cursor.item/vnd.commonsware.constant";
	//컬럼 명세 갖는 객체 선언
	private static HashMap<string,string> CONSTANTS_LIST_PROJECTION;

	//SQLite 연동을 위한 db선언
	private SQLiteDatabase db;

	public static final class Constants implements BaseColumns{
		public static final Uri CONTENT_URI =Uri.parse("content://"+AUTHORITY+"/constants");
		public static final String TITLE="title";
		public static final String VALUE="value";
	}
	static {
		//UriMatcher 객체 생성
		//전달되는 Uri가 집합데이터를 의미하는지 개별데이터를 의미하는지 여부 판결
		MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
		MATCHER.addURI(AUTHORITY, "constants", CONSTANTS);
		MATCHER.addURI(AUTHORITY, "constants/#", CONSTANT_ID);

		//컬럼 명세를 보관하는 객체
		CONSTANTS_LIST_PROJECTION = new HashMap<string,string>();
		CONSTANTS_LIST_PROJECTION.put(Provider.Constants._ID, Provider.Constants._ID);
		CONSTANTS_LIST_PROJECTION.put(Provider.Constants.TITLE, Provider.Constants.TITLE);
		CONSTANTS_LIST_PROJECTION.put(Provider.Constants.VALUE, Provider.Constants.VALUE);
	}
	
	@Override
	public boolean onCreate(){
		db=(new DatabaseHelper (getContext())).getWritableDatabase();
		return (db ==null)?false:true;
	}

	//전달된 URI를 통해서
	//집합데이터 / 개별데이터 요청 요부를 확인
	private boolean isCollectionUri(Uri url) {
		return(MATCHER.match(url)==CONSTANTS);
	}

	//기본 컬럼 명세를 갖고있는 객체 반환
	private HashMap<string, string=""> getDefaultProjection() {
		return(CONSTANTS_LIST_PROJECTION);
	}

	@Override
	public Cursor query(Uri url, String[] projection, String selection,
			String[] selectionArgs, String sort) {
		SQLiteQueryBuilder qb=new SQLiteQueryBuilder();

		qb.setTables(TABLE_NAME);

		if (isCollectionUri(url)) {
			//집합 데이터
			qb.setProjectionMap(getDefaultProjection());
		}
		else {
			//개별 데이터
			qb.appendWhere(Provider.Constants._ID+"="+url.getPathSegments().get(1));
		}

		String orderBy;

		if (TextUtils.isEmpty(sort)) {
			//전달되는 정렬 정보가 없을 경우
			orderBy=Provider.Constants.TITLE;
		} else {
			//전달되는 정렬 정보가 있을 경우
			orderBy=sort;
		}

		Cursor c=qb.query(db, projection, selection, selectionArgs,
				null, null, orderBy);
		//URI 원본자료가 변하면 그 사실을 Cursor 객체에 통보하는 역할
		//예)update후 query될 때 update시 변경된 자료 반영
		c.setNotificationUri(getContext().getContentResolver(), url);
		return c;
	}

	@Override
	public String getType(Uri url) {
		if (isCollectionUri(url)) {
			
			return(COLLECTION_TYPE);
		}
		
		return(SINGLE_TYPE);
	}

	@Override
	public Uri insert(Uri url, ContentValues initialValues) {
		long rowID;
		ContentValues values;

		if (initialValues!=null) {
			values=new ContentValues(initialValues);
		} else {
			values=new ContentValues();
		}

		if (!isCollectionUri(url)) {
			throw new IllegalArgumentException("Unknown URL " + url);
		}

		rowID=db.insert(TABLE_NAME, Provider.Constants.TITLE, values);
		if (rowID > 0) {
			Uri uri=ContentUris.withAppendedId(Provider.Constants.CONTENT_URI, rowID);
			getContext().getContentResolver().notifyChange(uri, null);
			return uri;
		}
		throw new SQLException("Failed to insert row into " + url);
	}

	@Override
	public int delete(Uri url, String where, String[] whereArgs) {
		int count;
		long rowId=0;

		if (isCollectionUri(url)) {
			count=db.delete(TABLE_NAME, where, whereArgs);
		}
		else {
			String segment=url.getPathSegments().get(1);
			rowId=Long.parseLong(segment);
			count=db
			.delete(TABLE_NAME, Provider.Constants._ID+"="
					+ segment
					+ (!TextUtils.isEmpty(where) ? " AND (" + where
							+ ')' : ""), whereArgs);
		}

		getContext().getContentResolver().notifyChange(url, null);
		return count;
	}

	@Override
	public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
		int count;

		if (isCollectionUri(url)) {
			count=db.update(TABLE_NAME, values, where, whereArgs);
		}
		else {
			String segment=url.getPathSegments().get(1);
			count=db
			.update(TABLE_NAME, values, Provider.Constants._ID+"="
					+ segment
					+ (!TextUtils.isEmpty(where) ? " AND (" + where
							+ ')' : ""), whereArgs);
		}

		getContext().getContentResolver().notifyChange(url, null);
		return count;
	}
	private class DatabaseHelper extends SQLiteOpenHelper {
		public DatabaseHelper(Context context) {
			super(context, DATABASE_NAME, null, 1);
		}

		
		
		@Override
		public void onCreate(SQLiteDatabase db) {

			try {
				db.execSQL(
				"CREATE TABLE constants (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, value REAL);");

				ContentValues cv=new ContentValues();
 
				cv.put(Constants.TITLE, "Gravity, Death Star I");
				cv.put(Constants.VALUE, SensorManager.GRAVITY_DEATH_STAR_I);
				db.insert("constants", Provider.Constants.TITLE, cv);

				cv.put(Constants.TITLE, "Gravity, Earth");
				cv.put(Constants.VALUE, SensorManager.GRAVITY_EARTH);
				db.insert("constants", Provider.Constants.TITLE, cv);

				cv.put(Constants.TITLE, "Gravity, Jupiter");
				cv.put(Constants.VALUE, SensorManager.GRAVITY_JUPITER);
				db.insert("constants", Provider.Constants.TITLE, cv);

				cv.put(Constants.TITLE, "Gravity, Mars");
				cv.put(Constants.VALUE, SensorManager.GRAVITY_MARS);
				db.insert("constants", Provider.Constants.TITLE, cv);
			}catch(SQLException e){
				Log.e("Provider",e.toString());
			}
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			Log.w("Constants", "Upgrading database, which will destroy all old data");
			db.execSQL("DROP TABLE IF EXISTS constants");
			onCreate(db);
		}
	}
}





res/ layout/ add_edit.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:text="이름:" />

        <EditText
            android:id="@+id/title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:text="값:" />

        <EditText
            android:id="@+id/value"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true" />
    </LinearLayout>

</LinearLayout>


res/ layout/ main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Hello World, ConstantsBrowser" />

</LinearLayout>


res/ layout/ row.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true" />

    <TextView
        android:id="@+id/value"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true" />

</RelativeLayout>


res/ values/ strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
        <string name="app_name">77ConstantsTwo</string>
        <string name="ok">확인</string>
        <string name="cancel">취소</string>
        <string name="add_title">상수 추가</string>
        <string name="delete_title">상수 데이터를 제거하시겠습니까?</string>
</resources>


src/ dr.android.contents2/ ConstantsTwo
package dr.android.contents2;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.SimpleCursorAdapter;

public class ConstantsTwo extends ListActivity {
	private static final String TITLE="title";
	private static final String VALUE="value";
	private static final String CONTENT_URI = 
			"content://dr.android.contents.Provider/constants";
	private static final String[] PROJECTION = new String[] {
		BaseColumns._ID, TITLE, VALUE};
	private Cursor constantsCursor;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//manageQuery()와 getContentResolver().query() 둘다 사용가능
		constantsCursor=managedQuery(
				Uri.parse(CONTENT_URI),PROJECTION, null, null, null);

		ListAdapter adapter=new SimpleCursorAdapter(this,
				R.layout.row, constantsCursor,
				new String[] {TITLE,VALUE},
				new int[] {R.id.title, R.id.value});

		setListAdapter(adapter);
		registerForContextMenu(getListView());
	}

	@Override
	public void onDestroy() {
		super.onDestroy();

		constantsCursor.close();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add(Menu.NONE, 1, Menu.NONE, "추가")
		.setIcon(R.drawable.add)
		.setAlphabeticShortcut('a');
		menu.add(Menu.NONE, 2, Menu.NONE, "종료")
		.setIcon(R.drawable.eject)
		.setAlphabeticShortcut('c');

		return(super.onCreateOptionsMenu(menu));
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case 1:
			add();
			return(true);

		case 3:
			finish();
			return(true);
		}

		return(super.onOptionsItemSelected(item));
	}

	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenu.ContextMenuInfo menuInfo) {
		menu.add(Menu.NONE, 2, Menu.NONE, "삭제")
		.setIcon(R.drawable.delete)
		.setAlphabeticShortcut('d');
	}

	@Override
	public boolean onContextItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case 2:
			AdapterView.AdapterContextMenuInfo info=
			(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();

			delete(info.id);
			return(true);
		}

		return(super.onOptionsItemSelected(item));
	}

	private void add() {
		LayoutInflater inflater=LayoutInflater.from(this);
		View addView=inflater.inflate(R.layout.add_edit, null);
		final DialogWrapper wrapper=new DialogWrapper(addView);

		new AlertDialog.Builder(this)
		.setTitle(R.string.add_title)
		.setView(addView)
		.setPositiveButton(R.string.ok,
				new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog,
					int whichButton) {
				processAdd(wrapper);
			}
		})
		.setNegativeButton(R.string.cancel,
				new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog,
					int whichButton) {
				// ignore, just dismiss
			}
		})
		.show();
	}

	private void delete(final long rowId) {
		if (rowId>0) {
			new AlertDialog.Builder(this)
			.setTitle(R.string.delete_title)
			.setPositiveButton(R.string.ok,
					new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog,
						int whichButton) {
					processDelete(rowId);
				}
			})
			.setNegativeButton(R.string.cancel,
					new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog,
						int whichButton) {
					// ignore, just dismiss
				}
			})
			.show();
		}
	}

	private void processAdd(DialogWrapper wrapper) {
		ContentValues values=new ContentValues(2);

		values.put(TITLE, wrapper.getTitle());
		values.put(VALUE, wrapper.getValue());

		getContentResolver().insert(Uri.parse(CONTENT_URI),values);
		constantsCursor.requery();
	}

	private void processDelete(long rowId) {
		Uri uri=ContentUris.withAppendedId(Uri.parse(CONTENT_URI),rowId);
		getContentResolver().delete(uri, null, null);
		constantsCursor.requery();
	}

	class DialogWrapper {
		EditText titleField=null;
		EditText valueField=null;
		View base=null;

		DialogWrapper(View base) {
			this.base=base;
			valueField=(EditText)base.findViewById(R.id.value);
		}

		String getTitle() {
			return(getTitleField().getText().toString());
		}

		float getValue() {
			return(new Float(getValueField().getText().toString()).floatValue());
		}

		private EditText getTitleField() {
			if (titleField==null) {
				titleField=(EditText)base.findViewById(R.id.title);
			}

			return(titleField);
		}

		private EditText getValueField() {
			if (valueField==null) {
				valueField=(EditText)base.findViewById(R.id.value);
			}

			return(valueField);
		}
	}
}









'Android > 기본' 카테고리의 다른 글

Android Video View (동영상 재생)  (0) 2012.04.28
Android Audio사용 (음악 재생)  (0) 2012.04.28
Android FileSearch Gallery(사진선택)  (0) 2012.04.28
Android Animaiton 으로 효과 (2)  (0) 2012.04.28
Android Paint로 그림그리기  (0) 2012.04.28
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/photo"
        android:visibility="gone"
        android:layout_weight="1" />
    
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/text"
        android:visibility="gone"
        android:layout_weight="0"/>
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/button01"
        android:text="사진 선택"
        android:layout_weight="0" />

</LinearLayout>


package dr.android.file.search;

import android.app.Activity;
import android.os.Bundle;
import java.io.File;
import java.io.IOException;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore.Images;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class FileSearchbyGallery extends Activity implements OnClickListener {
	ImageView photo;
	Button button01;
	TextView text;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		photo = (ImageView) findViewById(R.id.photo);
		text = (TextView) findViewById(R.id.text);
		button01 = (Button) findViewById(R.id.button01);

		button01.setOnClickListener(this);
	}

	public void onClick(View v) {
		// 갤러리를 호출해서 휴대폰에 저장된 이미지를 읽어들임
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_GET_CONTENT);
		intent.setType("image/*");// image/jpg, image/png
		startActivityForResult(intent, 0);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (data != null) {
			try {
				Uri uri = data.getData();
				// 이미지 정보 추출 및 표시
				text.setText("========이미지 정보===\n");
				text.append("URI : " + uri.toString() + "\n");
				text.append("Last Path Segment : " + uri.getLastPathSegment()
						+ "\n");
				//컨텐트 프로바이더로 구성된 정보를 DB로 부터 읽어옴
				Cursor c = getContentResolver().query(
						Images.Media.EXTERNAL_CONTENT_URI, null,
						Images.Media._ID + "=?",
						new String[] { uri.getLastPathSegment() }, null);

				if (c.moveToFirst()) {
					//getColumnIndexOrThrow : 컬럼의 인덱스 반환
					String imageFile = c.getString(c
							.getColumnIndexOrThrow(Images.Media.DATA));
					File f = new File(imageFile);
					text.append("원본 이미지 경로 : " + imageFile + "\n");
					text.append("이미지 용량 : " + f.length() + "\n");
				}
				text.setVisibility(View.VISIBLE);

				// ImageView 이미지 보여주기
				//컨텐트 프로바이더로 구성된 정보를 URI를 통해 읽어옴
				Bitmap image = Images.Media
						.getBitmap(getContentResolver(), uri);

				text.append("크기 : " + image.getWidth() + "*"
						+ image.getHeight() + "\n");

				photo.setImageBitmap(image);
				photo.setVisibility(View.VISIBLE);

			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}




'Android > 기본' 카테고리의 다른 글

Android Audio사용 (음악 재생)  (0) 2012.04.28
Android Constants Provider  (0) 2012.04.28
Android Animaiton 으로 효과 (2)  (0) 2012.04.28
Android Paint로 그림그리기  (0) 2012.04.28
Android Preferences 읽고 쓰기(환경설정)  (0) 2012.04.28

이미지가 서서히 변하는 효과(자연스럽게)

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:gravity="center" >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/img"
        android:src="@drawable/jessica" />

</LinearLayout>


alpha.xml
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="0.0"
    android:toAlpha="1.0"
    android:duration="2000"   />

<!--
    interpolator : 안드로이드에서 인터폴레이터는 애니메이션의 변화 정도를 정의
           이 값을 조정하여 애니메이션을 가속시킬 수도 있고, 감속시킬 수도 있으며 반복시킬수도 있음
    fromAlpha : 애니메이션 시작
    toAlpha : 애니메이션 끝
           알파값 : 0.0 (완전투명) ~ 1.0(완전 불투명)
    duration : 애니메이션이 진행되는데 "지연시간 (밀리세컨드)"
           참조 클래스 : android.viewanimation.AlphaAnimaiton

-->




main activity
package kr.android.animation;

import android.app.Activity;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

public class AnimationDemo1 extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		ImageView image = (ImageView)findViewById(R.id.img);
		Animation alphaAnim = AnimationUtils.loadAnimation(this, R.anim.alpha);
		image.startAnimation(alphaAnim);
	}
}





이미지가 확대 되고 한바퀴 돌려지는 효과 (캡쳐는 일부분)

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:gravity="center" >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/img"
        android:src="@drawable/jessica" />

</LinearLayout>




tween.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 
여러 가지 애니메이션 효과를 set로 묶어줌.
 -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
	android:interpolator="@android:anim/accelerate_decelerate_interpolator">
<!-- 
여러 가지 android:interpolator
1) 가속효과(accelerate,시작은 천천히, 갈수록 가속화) : accelerate_interpolator
2) 감속효과(decelarate, 시작은 빨리, 갈수록 감속화) : decelerate_interpolator
3) 가속/감속(시작과 끝은 천천히, 중간은 가속화) : accelerate_decelerate_interpolator
4) 튀는 효과(bounce, 공이 튀는 듯한 효과) : bounce_interpolator
5) 예측효과(anicipate,개구리가 움츠렸다 튀어나가는 듯한 효과) : anicipate_interpolator
6) 예측/넘침효과 : anicipate_overshoot_interpolator
7) 반복효과(cycle, 수학의 사인곡선을 이용하여 지정한 횟수만큼 반복):cycle_interpolator
8) 선형적인 변화지수(linear):linear_interpolator
9) 넘침효과(overshoot,원래 지정된 애니메이션 목표를 지나쳐버리는 효과):overshoot_interpolator
 --> 	
	<alpha 
       android:interpolator="@android:anim/accelerate_interpolator"
       android:fromAlpha="0.0" 
       android:toAlpha="1.0" 
       android:duration="1000" 
       />
	<scale 
		android:fromXScale="1.0" android:toXScale="2.0" 
		android:fromYScale="1.0" android:toYScale="2.0" 
		android:pivotX="50" android:pivotY="50%p"
		android:startOffset="2000"
		android:duration="1000" 
		/>
<!-- 
 pivotX, pivotY
 확대 변형을 하려면, 확대할 기준점이 필요. 이 값을 지정하지 않으면 객체의 중심점을 기준으로 변경
 "50"과 "50%"는 변형 대상 객체의 크기에 비율을 의미, "50%p"는 변형 대상 객체의 부모의 크기에 비례하여
 중심점을 정함.
 
 startOffset을 "2000"으로 하면 확대 효과를 2초 후에 작동하도록 설정
 -->	
	<translate 
		android:fromXDelta="0" 
		android:toXDelta="0" 
		android:fromYDelta="0" 
		android:toYDelta="50%" 
		android:startOffset="3000"
		android:duration="1000" 
		/>
	<rotate 
		android:fromDegrees="0" android:toDegrees="360"
		android:pivotX="0" android:pivotY="50%p"
		android:startOffset="4000"
		android:duration="1000" />
</set>	


package kr.android.animation2;

import android.app.Activity;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

public class AnimationDemo2 extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        ImageView image = (ImageView)findViewById(R.id.img);
        Animation tween = AnimationUtils.loadAnimation(this, R.anim.tween);
        image.startAnimation(tween);
    }
}


012


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>


package com.hardrock.hellotest;

import android.app.Activity;
import android.os.Bundle;
import android.graphics.Canvas;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.view.View;

public class PaintDemo extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(new ViewWithDraw(this));
	}

	private static class ViewWithDraw extends View{

		public ViewWithDraw(Context context){
			super(context);
		}

		@Override
		protected void onDraw(Canvas canvas){
			//백그라운드 색깔지정
			canvas.drawColor(Color.BLACK);

			Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

			//draw Line
			mPaint.setColor(Color.RED); //도형의 색깔지정
			mPaint.setStrokeWidth(10);	//도형의 두께
			canvas.drawLine(50, 0, 50, 100, mPaint);
						//시작 x 시작 y 끝x 끝y   paint객체

			mPaint.setColor(Color.GREEN);
			mPaint.setStrokeWidth(5);
			//alpha : 0(투명) ~255 (완전 불투명)
			for(int y = 30,alpha =255; alpha>2 ; alpha -=50, y+=10){
				//alpha값 지정(투명도)를 지정
				mPaint.setAlpha(alpha);
				canvas.drawLine(0,y,100,y,mPaint);
			}
			
			// draw Rect
			mPaint.setColor(Color.WHITE);
			// 테두리만 그린다.
			mPaint.setStyle(Paint.Style.STROKE);
			mPaint.setStrokeWidth(1);
			canvas.drawRect(120, 10, 120 + 80, 10 + 80, mPaint);
						 //left top    right     bottom
			
			mPaint.setColor(Color.MAGENTA);
			// 내부를 채운다
			mPaint.setStyle(Paint.Style.FILL);
			canvas.drawRect(220, 10, 220 + 80, 10 + 80, mPaint);

			// draw Arc(원호 원의 일부분)
			mPaint.setColor(Color.YELLOW);
			canvas.drawArc(new RectF(150, 120, 150 + 100, 120 + 100), 0, 50,
					true, mPaint); // 시작각도(0) , 끝각도(50), 중심사용여부(true)

			// draw Oval(타원도 포함한 원)
			mPaint.setColor(Color.GREEN);
			canvas.drawOval(new RectF(20, 250, 20 + 100, 250 + 50), mPaint);

			// draw RoundRect
			mPaint.setColor(Color.RED);
			canvas.drawRoundRect(new RectF(150, 250, 150 + 100, 250 + 50), 10,
					10, mPaint);//라운드의 정도(10),(10) 포토샵Father효과임

			// draw Path
			mPaint.setColor(Color.YELLOW);
			// 테두리만 그린다.
			mPaint.setStyle(Paint.Style.STROKE);
			mPaint.setStrokeWidth(2);

			Path mPath = new Path();
			mPath.moveTo(0, 0);
			mPath.lineTo(30, 60);
			mPath.lineTo(-30, 60);
			mPath.close();

			//전체 Path 가 위치할 x,y 좌표
			mPath.offset(150, 360);
			canvas.drawPath(mPath, mPaint);
		}
	}
}



<?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"
    >
	<EditText  
	    android:id="@+id/edit"
	    android:layout_width="fill_parent" 
	    android:layout_height="wrap_content" 
	    />
	<Button  
	    android:id="@+id/write"
	    android:layout_width="fill_parent" 
	    android:layout_height="wrap_content" 
	    android:text="프리퍼런스 쓰기"
	    />
	<Button  
	    android:id="@+id/read"
	    android:layout_width="fill_parent" 
	    android:layout_height="wrap_content" 
	    android:text="프리퍼런스 읽기"
	    />
	<TextView  
	    android:id="@+id/view"
	    android:layout_width="fill_parent" 
	    android:layout_height="wrap_content"
	    />
</LinearLayout>


package net.npaka.preferencesex;

import android.app.Activity;
import android.os.Bundle;
import android.content.SharedPreferences;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class PreferencesEx extends Activity implements View.OnClickListener{
	private EditText editText;//텍스트 박스
	private Button btnWrite;//읽기 버튼
	private Button btnRead;//쓰기 버튼
	private TextView view;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		editText = (EditText)findViewById(R.id.edit);
		btnWrite = (Button)findViewById(R.id.write);
		btnRead= (Button)findViewById(R.id.read);
		view= (TextView)findViewById(R.id.view);

		btnWrite.setOnClickListener(this);
		btnRead.setOnClickListener(this);
	}

	public void onClick(View v) {
		if(v==btnWrite){
			//SharedPreferences 객체 구하기(1)
			SharedPreferences pref = getSharedPreferences("PreferencesEx",MODE_PRIVATE);

			//프리퍼런스의 쓰기(2)
			SharedPreferences.Editor editor =pref.edit();
			editor.putString("text", editText.getText().toString());
			//반드시 commit()메소드를 호출해야 저장됨
			editor.commit();
			editText.setText("");
		}else if(v==btnRead){
			//SharedPreferences 객체 구하기(1)
			SharedPreferences pref = getSharedPreferences("PreferencesEx",MODE_PRIVATE);

			//프리퍼런스로부터 읽기(3)
			view.setText(pref.getString("text",""));
		}
	}
}




+ Recent posts