이미지

https://youtu.be/hq3lbHR2wtM

 

 

 

다빈치 리졸브 15 에서 이미지가 특정 위치를 따라다니게 하는 방법

 

자세한 방법은 동영상을 참고

 

먼저 Fusion 탭에 진입하여 MediaIn 1 선택된 채로 컨트롤 + 스페이스바를 누르면 검색창이 뜬다. tracker를 검색하여 추가해준다.

 

tracker 검색
tracker 추가된 모습

 

트래커를 선택하면 영상 위에 트래커가 노출이 된다. 왼쪽 모서리를 선택하여 드래그하여 위치 추적할 곳에 둔다

 

트래커 모습

 

그리고 왼쪽 Inspector에서 5번째 재생바 버튼을 눌러 추적을 시작함

5번째 버튼 클릭

 

 

 

그럼 트래킹이 시작되고 완료되면 이미지를 아래 노드 쪽으로 끌어온 뒤 컨트롤 + 스페이스바 를 눌러 transform 을 추가해준다

 

transform 검색

 

transform을 추가한 뒤 트래커와 연결해주어야 한다.

 

연결된 모습

 

 

그리고 트래커 노드 선택 후 Operation 메뉴에서 Match Move로 변경해주면 영상 위에 이미지가 노출된다.

Match Move로 설정해준다.

 

 

이미지가 노출되면 다시 transform 노드를 선택해준다. 그럼 이미지에 아래와 같이 표시가 된다.

 

사각형은 이미지 크기를, 원형은 이미지 기울기를, 가운데는 이미지를 이동 시킬 수 있다. 이미지를 배치해놓고 재생하면 트래킹한 경로대로 이미지가 잘 따라다니게 된다.

 

 


스피너를 이용하여 값을 전달한 후 값에 따른 이미지를 출력하였다.

string.xml에 스피너에 쓰일 목록을 만들어둔다.



<string name="season">시즌</string>
    
    <string name="season_prompt">시즌 선택</string>
    <string-array name="season_array">
        <item>봄</item>
        <item>여름</item>
        <item>가을</item>
        <item>겨울</item>
    </string-array>



그 다음 send.xml



 <Spinner 
         android:id="@+id/spinner_season" <!--스피너 아이디-->
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:prompt="@string/season_prompt"<!-- string.xml에서 작성한 목록 -->
         android:layout_marginRight="10dp"
          />




이렇게 스피너를 만들어준다.



그리고 SendActivity.java 에서 스피너 값을  보내주자 OnCreate 부분에


Spinner spinner = (Spinner)findViewById(R.id.spinner_season);//send.xml의 스피너 아이디
		
		ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.season_array,
				android.R.layout.simple_spinner_item);
		
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		spinner.setAdapter(adapter);



이렇게 스피너를 선언해주고 Onclick메소드에 스피너 값을 인텐트에 태워 보낸다.


String str_season = spinner.getSelectedItem().toString();	
	 	
 Intent it3 = new Intent(this,ReceiveActivity.class);
			 
	 
			 
 it3.putExtra("it3_season", str_season);	//it3_season 이라는 스트링으로 str_season 값을 넘긴다.	 
 
startActivity(it3);





이제 스피너 값에 따른 이미지를 출력하기 위해 receive.xml 에

이미지 뷰를 만들었다


  <ImageView
       android:id="@+id/season_year"
       		
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"     
                      
       />




이제 ReceiveActivity.java 에서 받아보자.

마찬가지로 OnCreate 부분에



Intent it3=getIntent();		//인텐트를 받아오고
		
		String str_season= it3.getStringExtra("it3_season"); //it3_season으로 보내온 값을 str_season에 저장
		
		ImageView season = (ImageView)findViewById(R.id.season_year); //사진을 출력할 이미지뷰
		if(str_season.equals("봄")){ //str_season 값이 봄이라면
			BitmapDrawable img_season = (BitmapDrawable)getResources().getDrawable(R.drawable.spring); //봄 사진 가져와서
			season.setImageDrawable(img_season);//봄 사진 출력
		}else if(str_season.equals("여름")){
			BitmapDrawable img_season = (BitmapDrawable)getResources().getDrawable(R.drawable.summer);
			season.setImageDrawable(img_season);
		}else if(str_season.equals("겨울")){
			BitmapDrawable img_season = (BitmapDrawable)getResources().getDrawable(R.drawable.autumn);
			season.setImageDrawable(img_season);
		}else if(str_season.equals("가을")){
			BitmapDrawable img_season = (BitmapDrawable)getResources().getDrawable(R.drawable.winter);
			season.setImageDrawable(img_season);
		}



여기서 애를 먹었던게 if 값을 그냥 평소 하던대로

if(str_season == "봄") 이런식으로 해줬는데 안되서 찾아보니까 String 값은

str_season.equals("봄")  

이런식으로 해줘야 했다.


이제 스피너로 봄 값이 넘어오면 이미지뷰에 봄 사진을 넣어주고 여름이면 여름사진을 보여준다.

아 소스코드 태그 은근 귀찮네..






  1. 뿌잉뿌잉 2013.10.26 22:35

    Intent it3 = new Intent(this,ReceiveActivity.class); 에서 오류가 생겨서 this를 getApplicationContext()로 바꿔줬는데요
    소스창에서 에러가 뜨지는 안는데 시뮬레이션에서 에러가뜨네요 ㅜㅜ this를 바꿔준게 문제일까요??ㅜㅜ

    • yonoo88 2013.10.26 23:54 신고

      오류 메세지가 어떤건지 알려주실 수 있나요? 도움이 된다면 드리고 싶네요

  2. 으악 2013.11.09 09:07

    저는 this를 sendActivity.this 로 바꾸고 실행시켰더니 OnClick 메소드에서 오류가 뜨네요ㅠㅠ
    OnItemClicked로도 바꿔봤는데 spinner 와 같이 쓸수 없다는 에러가 떠요ㅜㅜ 그부분도 코드 올려주실수 있나요?

    • yonoo88 2013.11.09 00:12 신고

      글대로 해도 오류가 났나요? 혹시 로그캣 에러메시지를 알려주실 수 있나요? 저는 딱 위 글처럼 했거든요.

    • 으악 2013.11.09 01:33

      java.lang.RuntimeException: Unable to start activity componentInfo: java.lang.RuntimeException:Don't call setOnClickListener for an adapterView. 이렇게 떠요ㅜㅜ

    • yonoo88 2013.11.09 01:49 신고

      저 로그캣메시지만 나오나요? 전체 메시지를 봤으면 해서요

      로그캣 메시지 중 아랫쪽 부분에 프로젝트내 액티비티와 소스 몇번째 코드인지 나와있는 부분이나 널 포인트 에러메시지가 있다면 더 문제알기가 쉬울꺼 같습니다.

      혹시나 참고가 되는 글이 있나요?
      검색 링크 입니다.
      https://www.google.co.kr/search?q=Don't+call+setOnClickListener+for+an+adapterView&oq=Don't+call+setOnClickListener+for+an+adapterView&aqs=chrome..69i57&sourceid=chrome&espv=210&es_sm=122&ie=UTF-8#es_sm=122&espv=210&newwindow=1&q=Don't+call+setOnClickListener+for+an+adapterView&tbas=0

    • 으악 2013.11.09 09:08

      11-08 23:57:19.334: E/dalvikvm(752): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
      11-08 23:57:58.653: E/AndroidRuntime(752): FATAL EXCEPTION: main
      11-08 23:57:58.653: E/AndroidRuntime(752): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.itm.android/com.itm.android.Fragment02}: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1797)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:682)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.widget.TabHost.setCurrentTab(TabHost.java:346)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:540)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.view.View.performClick(View.java:3511)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.view.View$PerformClick.run(View.java:14105)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.os.Handler.handleCallback(Handler.java:605)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.os.Handler.dispatchMessage(Handler.java:92)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.os.Looper.loop(Looper.java:137)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.ActivityThread.main(ActivityThread.java:4424)
      11-08 23:57:58.653: E/AndroidRuntime(752): at java.lang.reflect.Method.invokeNative(Native Method)
      11-08 23:57:58.653: E/AndroidRuntime(752): at java.lang.reflect.Method.invoke(Method.java:511)
      11-08 23:57:58.653: E/AndroidRuntime(752): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
      11-08 23:57:58.653: E/AndroidRuntime(752): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
      11-08 23:57:58.653: E/AndroidRuntime(752): at dalvik.system.NativeStart.main(Native Method)
      11-08 23:57:58.653: E/AndroidRuntime(752): Caused by: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.widget.AdapterView.setOnClickListener(AdapterView.java:761)
      11-08 23:57:58.653: E/AndroidRuntime(752): at com.itm.android.Fragment02.onCreate(Fragment02.java:65)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.Activity.performCreate(Activity.java:4465)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
      11-08 23:57:58.653: E/AndroidRuntime(752): ... 18 more
      11-09 00:03:04.966: E/AndroidRuntime(800): FATAL EXCEPTION: main
      11-09 00:03:04.966: E/AndroidRuntime(800): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.itm.android/com.itm.android.Fragment02}: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1797)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:682)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.widget.TabHost.setCurrentTab(TabHost.java:346)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:540)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.view.View.performClick(View.java:3511)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.view.View$PerformClick.run(View.java:14105)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.os.Handler.handleCallback(Handler.java:605)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.os.Handler.dispatchMessage(Handler.java:92)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.os.Looper.loop(Looper.java:137)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.ActivityThread.main(ActivityThread.java:4424)
      11-09 00:03:04.966: E/AndroidRuntime(800): at java.lang.reflect.Method.invokeNative(Native Method)
      11-09 00:03:04.966: E/AndroidRuntime(800): at java.lang.reflect.Method.invoke(Method.java:511)
      11-09 00:03:04.966: E/AndroidRuntime(800): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
      11-09 00:03:04.966: E/AndroidRuntime(800): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
      11-09 00:03:04.966: E/AndroidRuntime(800): at dalvik.system.NativeStart.main(Native Method)
      11-09 00:03:04.966: E/AndroidRuntime(800): Caused by: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.widget.AdapterView.setOnClickListener(AdapterView.java:761)
      11-09 00:03:04.966: E/AndroidRuntime(800): at com.itm.android.Fragment02.onCreate(Fragment02.java:65)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.Activity.performCreate(Activity.java:4465)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
      11-09 00:03:04.966: E/AndroidRuntime(800): ... 18 more

    • yonoo88 2013.11.09 12:53 신고

      저도 아직 초보라 도움이 되실련지 모르겠지만
      로그캣에서
      11-08 23:57:58.653: E/AndroidRuntime(752): at com.itm.android.Fragment02.onCreate(Fragment02.java:65)
      이부분이 있는데 65번째 줄 소스코드가 어떻게 되나요?

      초반에 스피너 호출하는 부분인거같은데

      Spinner spinner = (Spinner)findViewById(R.id.spinner_season);//send.xml의 스피너 아이디

      ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.season_array,
      android.R.layout.simple_spinner_item);

      adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
      spinner.setAdapter(adapter);

      이 소스코드 부분이 아닐까 생각해봅니다.
      그리고 스피너로 어떤 기능을 만드시는 건가요

  3. 안녕하세요^^ 2013.12.19 16:18

    질문이있습니다!
    스피너를 2개 이상 쓸 때는 인텐트를 어떻게 해야하나요? 여러번 시도해봤는데 어떻게 하는건지 모르겠네요ㅠㅠ
    예를 들어 시즌뿐만 아니라 스포츠 사진을 스피너를 통해 더 넣고 싶다던지.. 한데 둘다 어떻게 하면 넘길 수 있을까요ㅠ

    • yonoo88 2013.12.20 00:05 신고

      인텐트는 하나만 쓰시면 되고

      스포츠사진을 넘겨줄 값을 하나 더 만드시면됩니다.

      위 예제에서는
      it3.putExtra("it3_season", str_season);
      이런식으로 시즌 값을 보냈따면

      스포츠사진에 사용할 스피너를 하나 더 만드시고
      it3.putExtra("it3_sportsImg", str_sportsImg);
      이런식으로 보내시면 됩니다.


      인텐트는 장바구니 같은거라고 보시면됩니다.
      그 안에 스피너 값, 텍스트 값 등등이 들어가는거죠


이미지를 캡쳐해서 저장한 후 공유하기를 통해 이미지를 공유하고 싶었다.

이 공유하기 기능을 사용하면 카톡 페북 미투데이 등등 메뉴가 저절로 나온다.신기방기


                         Intent intentSend  = new Intent(Intent.ACTION_SEND);

 intentSend.setType("image/*");

 intentSend.putExtra(Intent.EXTRA_STREAM, Uri.parse(파일경로));

 startActivity(Intent.createChooser(intentSend, "공유"));

특정파일을 공유하기 위해 다음과 같이 사용했다.

공유하기 버튼을 만들어 그 안에 집어넣었다.

Intent it3=getIntent(); //파일명을 가져오기 위한 인텐트(에디트텍스트에서 이름입력받은 걸 파일명으로 쓰기 위해)

String str_name=it3.getStringExtra("it3_name"); //이름을 가져온다.

File fileRoute = null;

fileRoute = Environment.getExternalStorageDirectory(); //sdcard 파일경로 선언

        File files = new File(fileRoute,"/temp/"+str_name+"-.jpeg"); //temp폴더에 이름으로 저장된 jpeg파일 경로 선언

    

if(files.exists()==true)  //파일유무확인

{

Intent intentSend  = new Intent(Intent.ACTION_SEND);

intentSend.setType("image/*");


//이름으로 저장된 파일의 경로를 넣어서 공유하기

intentSend.putExtra(Intent.EXTRA_STREAM, Uri.parse(fileRoute+"/temp/"+str_name+"-.jpeg"));


startActivity(Intent.createChooser(intentSend, "공유")); //공유하기 창 띄우기

}else{

//파일이 없다면 저장을 해달라는 토스트메세지를 띄운다.

Toast.makeText(getApplicationContext(), "저장을 먼저 해주세요", Toast.LENGTH_LONG).show();

}


소스양식버전


Intent it3=getIntent();	//파일명을 가져오기 위한 인텐트(에디트텍스트에서 이름입력받은 걸 파일명으로 쓰기 위해)

	String str_name=it3.getStringExtra("it3_name");	//이름을 가져온다.	

	File fileRoute = null;

	fileRoute = Environment.getExternalStorageDirectory(); //sdcard 파일경로 선언

			

        File files = new File(fileRoute,"/temp/"+str_name+"-.jpeg"); //temp폴더에 이름으로 저장된 jpeg파일 경로 선언

		     

	 if(files.exists()==true)  //파일유무확인

	 {

			 Intent intentSend  = new Intent(Intent.ACTION_SEND);

			 intentSend.setType("image/*");



//이름으로 저장된 파일의 경로를 넣어서 공유하기

			 intentSend.putExtra(Intent.EXTRA_STREAM, Uri.parse(fileRoute+"/temp/"+str_name+"-.jpeg"));



			 startActivity(Intent.createChooser(intentSend, "공유")); //공유하기 창 띄우기

		 }else{

//파일이 없다면 저장을 해달라는 토스트메세지를 띄운다.

			 Toast.makeText(getApplicationContext(), "저장을 먼저 해주세요", Toast.LENGTH_LONG).show();

		 }





  1. 초보 2014.03.18 11:37

    안녕하세요 유용한 팁 잘 보았습니다 그런데 리스트를 띄우지 않고 바로 카카오톡이나 페이스북으로 공유를 보낼 수 있는 방법이 있을까요?

    • yonoo88 2014.03.18 21:48 신고

      음 그 부분은 저도 한번 살펴봐야겠네요..

    • 초보 2014.03.19 15:38

      방법을 찾으신다면 댓글로 간략하게라도 답변을 부탁드립니다 ㅠㅠ아니면 리스트중에 카카오톡/페이스북 같이 지정된 앱만 출력하는 방법은 있을까요?

    • yonoo88 2014.03.19 16:12 신고

      http://www.kakao.com/services/api/kakao_link

      여기 한번 보시면 될려나요

      사용예로

      // KakaoTalk으로 바로 보내시려면 아래 코드를 추가합니다.
      intent.setPackage("com.kakao.talk");

      이러한 코드가 있네요.


      http://dev.epiloum.net/916

      여기 링크도 참고해보셔요

    • 초보 2014.03.24 11:08

      오 감사합니다 ㅠㅠ

  2. ㅎㅇ 2016.08.22 14:25

    지금 fileRoute = Environment.getExternalStorageDirectory(); 이부분이 Required java.io.File Found java.lang.String 이렇게 빨간색으로 뜨고
    Intent it3=getIntent(); 이부분에서 getintent 이부분이 cannot resolve symbol getIntent 이렇게 뜨는데 제가 지금 어뎁터 안에 있는 onClick 안에 지정을 해서 오류가 나는건가요?

    • yonoo88 2016.08.22 18:13 신고

      저도 잘 보진 못하지만 코드를 봐봐야 알 것 같네요..




내가 참고한 블로그. 


http://theeye.pe.kr/entry/example-of-image-crop-with-camera-and-album-picker-on-android?category=18



트랙백은 뭐하는건지 모르겠다..

누가 알려주실 분..


그리고 위 소스는 정사각형으로 밖에 자르기가 안되는데 직사각형으로도 자르게 하려면


case PICK_FROM_CAMERA: { // 이미지를 가져온 이후의 리사이즈할 이미지 크기를 결정합니다. // 이후에 이미지 크롭 어플리케이션을 호출하게 됩니다. Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(mImageCaptureUri, "image/*"); intent.putExtra("outputX", 120); intent.putExtra("outputY", 130); intent.putExtra("aspectX", 1); //이걸 삭제한다 intent.putExtra("aspectY", 1); //이걸 삭제한다 intent.putExtra("scale", true); intent.putExtra("return-data", true); startActivityForResult(intent, CROP_FROM_CAMERA); break; }


이 2개를 지워주면 자유자재로 자르기가 가능하다.
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
 X Y 좌표가 1:1 비율로 고정됐기 때문에 정사각형으로만 자르기가 되었던 것이었따. 




+ Recent posts