Android 2012. 4. 25. 18:47

안녕하세요, 


카카오톡이나 마이피플같은 대화형식의 레이아웃을 구성할 때에 보면


말풍선 이미지를 사용합니다. 이 이미지가 안에 텍스트 내용이 많건 적건


깨지지않고 잘 늘어나는데요 . 


나인패치를 이용하면 가능합니다. 



안드로이드 SDK 폴더  > tools 에 가시면 draw9patch 라는 실행 파일이있습니다.


실행하시면 도스 또는 맥사용자면 터미널 창이 뜨는데요 조금 기다리시면 


이런 나인패치 창이 뜹니다. 


도스창을 끄시면 나인패치창도 꺼지니 끄시면 안돼요



이제 여기에 사용할 말풍선 이미지를 드래그로 끌어다 놓습니다. 


제가 사용할 이미지는 이렇게 작은 이미지입니다. 





드래그를 하면 이런 창으로 바뀝니다.






(클릭하시면 크게 보실 수 있습니다)


먼저 하단에 zoom 틀을 조절하여 보기 편하게 조절합니다. 


체크박스 들을 보시면 


Show lock - 이미지 조작을 할 수 없는 영역을 표시

Show content - 해당 내용물(대화텍스트)가 들어갈 영역을 표시

Show patches - 늘어날 영역을 표시


다 체크하는게 보기에 편합니다. 


이제 사용방법인데 일단 이미지가 있는 사각틀을 기준으로 


top, left의 빨간색 화살표 면은 늘어날 부분을 선택하는 면입니다. 


right, bottom 의 파란색영역은 텍스트가 차지할 영역입니다. 



마우스 좌클릭을 이용하여 저 체스판같은 모양의 가장자리 픽셀을 


선택하시면 그림과 같이 검은색 점이 찍힙니다. 이 점은 가장자리 1픽셀만 


선택되고 그 안쪽영역은 선택을 못합니다. 왼쪽면을 보시면 위아래 두 픽셀씩 


선택을 하였는데 이게 늘어날 영역입니다. 사실 한 픽셀만 선택해도 그 픽셀이


쭉늘어나는거라 상관없습니다. 말풍선 꼬리를 제외한 세로로 늘어날 영역을 


클릭 하신 후 이제 가로로 늘어날 부분을 top에서 산택해 줍니다


전체 이미지에서 가로로 늘어날 부분은 말풍선 본체이므로 본체쪽만 한 픽셀정도


선택하여 주심됩니다. 늘어날 부분 선택시 주의사항은 말풍선 가장자리 둥근면을


선택하시면 그 면이 쭉 늘어나 이미지가 깨지게되니 되도록 둥근 모서리는 


선택하지마시고 단면을 선택하셔야 합니다.


right와 bottom 은 내용물이 들어갈 영역입니다. 보시면 아시겠지만 대화창의 


둥근 가장자리까지 선택을 하지않아 자체적으로 알맞게 패딩이 들어가도록


하였습니다. 우측 이미지 세장을 보시면 이미지가 늘어나는 방향에 따라 


늘어난 모양과 보라색영역은 방금 right


와 bottom에서 지정한 영역으로 


글씨가 들어갈 영역입니다. 알맞게 되었으니 컨트롤 + S로 세이브를 합니다.



파일명이 ninepatch.9.png 이런식으로 사이에 9가 끼는데 이게 나인패치 적용


이미지라는 표시입니다. 그대로 리소스폴더에 추가해주시면 됩니다. 


이 이미지를 그대로 보시면 




보시다시피 아까 선택된 검은 선까지 나오는데  이는 실제 안드로이드에서


구동시 표시가 안되므로 신경안쓰셔도 됩니다. 





main.xml 일부인데요 . 이 이미지를 텍스트뷰를 감싸는 리니어에 


배경이미지로 등록하였습니다. 그러고 긴 글을 넣어보면 








이렇게 나인 패치를 적용한 이미지는 아까 right, bottom에서 적용한 영역만


글씨가 들어가고 left,top에서 선택한 영역만 늘어나 깔끔하게 깔린 반면 


기본 이미지를 하면 말풍선 꼬리까지 늘어나는 불상사가..생기게 됩니다 .


앞으로 자주 사용 할 것 같습니다.


감사합니다.






posted by 젊은쎄오
:
Android 2012. 4. 24. 18:14

안녕하세요. 


요전번 프로젝트에서 한 화면에서 세가지의 기능을 보여주는 부분이 있었습니다.


처음엔 TabView로 구현하기로 했는데 , 위에 탭들을 보니 디자인이 너무 안이뻐서


방법을 찾아보았는데 제가 찾기론 그게 생각만큼 커스텀이 이쁘게 안되더군요. 


그래서 main.xml에 세가지 기능의 레이아웃을 다 넣고 Relative로 겹쳐놓는 


방법밖에 없었는데 그럼 main.xml이 너무 길고 복잡해져서 조금더 찾아봤더니


include라는 것을 알게되었습니다. 


include는 레이아웃 xml에서 한 영역을 정하고 그 영역에 겹쳐서 보여줄 xml을 


등록하는 기능입니다. 쉽게말해 TabView는 탭별로 액티비티가 등록되어 


액티비티 호출을 하지만 include는 View를 겹쳐놓고 VISIBLE, GONE으로 


제어하는 것입니다. 그 뷰들을 main.xml에 안넣고 각각 .xml 파일로 관리가되니


복잡하지않고 main.xml에서는 세가지 xml이 보여줄 공간 layout만 잡아주면 되는거죠



main.xml



main.xml에 이러한 공간을 잡아줍니다. 그리고 include 태그로 각각의 xml을 


등록해줍니다. 


layout="@layout/추가할 xml 이름"  입니다. id에는 이제 이 뷰를 컨트롤 할 


id를 새로 만들어주시는 거구요.




지금 추가한 공간입니다. 저 녹색 테두리 공간이 includeLayout 공간이고


이제 include 된 세가지 xml을 VISIBLE, GONE 으로 컨트롤 하면 


저 공간 안에서 탭뷰와같은 뷰교체가 이루어집니다.
























그리고 위와같이 View 객체를 만들어 각각 뷰에 등록해줍니다. 


여기서의 id는 아까 include 등록할 때의 id입니다. 원래의 .xml 파일 명을 쓰시면 안됩니다.


그리고 


infoView.setVisibility(View.VISIBLE);

mapView.setVisibility(View.GONE);

socialView.setVisibility(View.GONE);


이런식으로 해당 뷰 초기화를 해주어 각각 뷰마다 해당 뷰만 보일 수 있게 걸어놓으면 됩니다.






그럼 이렇게 위에 이미지 버튼마다 해당하는 뷰가 노출되게 됩니다. TabView 처럼요.


이 모든게 저 탭 버튼 때문입니다. 제가 포스팅하면서도 한 번 더 찾아봤는데 


기본 TabView로는 커스텀을 아무리해도 저런 이미지를 씌울수없는것 같습니다. 


저 이쁜 탭버튼 이미지를 사용하기 위해 include를 사용해봤네요. 


저 위 세가지 탭버튼은 이미지뷰입니다. 


예제파일 첨부해놓습니다. 감사합니다




IncludeTest.zip









posted by 젊은쎄오
:
Android 2012. 4. 24. 11:22

안녕하세요, 


리스트뷰를 사용하다보면 스크롤 할 때 , 특히 갤럭시 시리즈에 리스트뷰 선택 영역이 


검게 선택 되어 보기 싫을 때가 있습니다. 


그럴 때 리스트뷰에 



 android:cacheColorHint="#00000000" 


를 주시면 선택영역이 표시되지 않습니다.


추가로 선택 항목(row)의 색을 빼거나 바꾸려면 해당 리스트뷰 xml에 



  android:listSelector="#00000000" 


이렇게 추가해 주시면 됩니다. 

posted by 젊은쎄오
:
Android 2011. 11. 30. 14:44

EditText를 사용할 때 특성 시점에 EditText에 포커스를 강제로주면 키보드는 올라오지 않더군요 

그래서 강제로 보이게하는 코드가 있습니다.

EditText editText = (EditText) findViewById(R.id.EditText01);
//보이기
InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mInputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
//가리기	
InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mInputMethodManager.hideSoftInputFromWindow(editText.getWindowToken(), 0);
posted by 젊은쎄오
:
Android 2011. 11. 30. 13:32
간단합니다 .

Manifest 에 해당 액티비티로 가셔서

 
android:windowSoftInputMode="adjustUnspecified|adjustPan"
이거 한 줄 추가해 주시면 소프트키보드 위로 올라옵니다.
posted by 젊은쎄오
:
Android 2011. 11. 29. 14:36
여러가지 인텐트 활용법 입니다.


//show webapp:
Uri uri = Uri.parse("http://www.google.com");
Intent it  = new Intent(Intent.ACTION_VIEW,uri);
startActivity(it);

//show maps:
Uri uri = Uri.parse("geo:38.899533,-77.036476");
Intent it = new Intent(Intent.Action_VIEW,uri);
startActivity(it); 

//show ways
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");
Intent it = new Intent(Intent.ACTION_VIEW,URI);
startActivity(it);

//call dial program
Uri uri = Uri.parse("tel:xxxxxx");
Intent it = new Intent(Intent.ACTION_DIAL, uri);  
startActivity(it);  

Uri uri = Uri.parse("tel.xxxxxx");
Intent it =new Intent(Intent.ACTION_CALL,uri);
//don't forget add this config:

//send sms/mms
//call sender program
Intent it = new Intent(Intent.ACTION_VIEW);   
it.putExtra("sms_body", "The SMS text");   
it.setType("vnd.android-dir/mms-sms");   
startActivity(it);  

//send sms
Uri uri = Uri.parse("smsto:0800000123");   
Intent it = new Intent(Intent.ACTION_SENDTO, uri);   
it.putExtra("sms_body", "The SMS text");   
startActivity(it);  

//send mms
Uri uri = Uri.parse("content://media/external/images/media/23");   
Intent it = new Intent(Intent.ACTION_SEND);   
it.putExtra("sms_body", "some text");   
it.putExtra(Intent.EXTRA_STREAM, uri);   
it.setType("image/png");   
startActivity(it); 

//send email
 
Uri uri = Uri.parse("mailto:xxx@abc.com");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(it);

Intent it = new Intent(Intent.ACTION_SEND);   
it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");   
it.putExtra(Intent.EXTRA_TEXT, "The email body text");   
it.setType("text/plain");   
startActivity(Intent.createChooser(it, "Choose Email Client"));  

Intent it=new Intent(Intent.ACTION_SEND);     
String[] tos={"me@abc.com"};     
String[] ccs={"you@abc.com"};     
it.putExtra(Intent.EXTRA_EMAIL, tos);     
it.putExtra(Intent.EXTRA_CC, ccs);     
it.putExtra(Intent.EXTRA_TEXT, "The email body text");     
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");     
it.setType("message/rfc822");     
startActivity(Intent.createChooser(it, "Choose Email Client"));   


//add extra
Intent it = new Intent(Intent.ACTION_SEND);   
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");   
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");   
sendIntent.setType("audio/mp3");   
startActivity(Intent.createChooser(it, "Choose Email Client"));

//play media
Intent it = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/song.mp3");
it.setDataAndType(uri, "audio/mp3");
startActivity(it);

Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");   
Intent it = new Intent(Intent.ACTION_VIEW, uri);   
startActivity(it);  

//Uninstall
Uri uri = Uri.fromParts("package", strPackageName, null);   
Intent it = new Intent(Intent.ACTION_DELETE, uri);   
startActivity(it);

//uninstall apk
Uri uninstallUri = Uri.fromParts("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);

//install apk
Uri installUri = Uri.fromParts("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);

//play audio
Uri playUri = Uri.parse("file:///sdcard/download/everything.mp3");
returnIt = new Intent(Intent.ACTION_VIEW, playUri);

//send extra
Intent it = new Intent(Intent.ACTION_SEND);  
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");  
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/eoe.mp3");  
sendIntent.setType("audio/mp3");  
startActivity(Intent.createChooser(it, "Choose Email Client"));

//search
Uri uri = Uri.parse("market://search?q=pname:pkg_name");  
Intent it = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(it);  
//where pkg_name is the full package path for an application  

//show program detail page
Uri uri = Uri.parse("market://details?id=app_id");  
Intent it = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(it);  
//where app_id is the application ID, find the ID  
//by clicking on your application on Market home  
//page, and notice the ID from the address bar


//search google
Intent intent = new Intent();
intent.setAction(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY,"searchString")
startActivity(intent);


출처 : http://snipt.net/Martin/tag/android
posted by 젊은쎄오
:
Android 2011. 11. 28. 11:50

한 화면에 여러개의 뷰를 놓고 싶을 때가 있습니다. 


아래는 간단한 flipper 소스입니다.

처음 터치한 x좌표와 손을 뗀 좌표를 받아서 두 값의 크기를 비교하여 좌로 슬라이드인지

우로 슬라이드 인지 판별한 다음 해당 방향으로 슬라이드 되는 애니메이션이 동작하며

다른 뷰로 전환하게 됩니다.


/*************** Flipper *****************/
if (v != flipper)
	return
if (event.getAction() == MotionEvent.ACTION_DOWN) { xEnd = event.getX(); } else if (event.getAction() == MotionEvent.ACTION_UP) { xStart = event.getX(); // 시작, 끝점의 차가 50 이상이면 슬라이드로 인지하고 flipper가 동작함 if (xStart < xEnd) { float difVal = xEnd- xStart; if(difVal > 50){ flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in)); flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out)); flipper.showNext(); flipperIndex = flipper.getDisplayedChild();//flipper의 현재 위치 인덱스를 가져옴 FlipperIndex(flipperIndex);//flipper의 현재 위치를 들고 페이지 표시 매소드 호출 } } else if (xStart > xEnd) { float difVal = xStart- xEnd; if(difVal > 50){ flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in)); flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out)); flipper.showPrevious(); flipperIndex = flipper.getDisplayedChild();//flipper의 현재 위치 인덱스를 가져옴 FlipperIndex(flipperIndex);//flipper의 현재 위치를 들고 페이지 표시 매소드 호출 } } } return true; /**************** Flipper ***************/


아래는 풀 소스 입니다


public class MyViewFlipper extends Activity implements View.OnTouchListener,
CompoundButton.OnCheckedChangeListener {
	CheckBox checkBox;
	ViewFlipper flipper;
	int flipperIndex;
	ImageView view1, view2, view3, view4, view5, view6, 
		view7, view8, view9, viewb1, viewb2,viewb3;
	float xStart;
	float xEnd;

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

		viewb1 = (ImageView) findViewById(R.id.viewb1);
		viewb2 = (ImageView) findViewById(R.id.viewb2);
		viewb3 = (ImageView) findViewById(R.id.viewb3);
		view1 = (ImageView) findViewById(R.id.view1);
		view2 = (ImageView) findViewById(R.id.view2);
		view3 = (ImageView) findViewById(R.id.view3);
		view4 = (ImageView) findViewById(R.id.view4);
		view5 = (ImageView) findViewById(R.id.view5);
		view6 = (ImageView) findViewById(R.id.view6);
		view7 = (ImageView) findViewById(R.id.view7);
		view8 = (ImageView) findViewById(R.id.view8);
		view9 = (ImageView) findViewById(R.id.view9);
		view1.setOnTouchListener(this);
		view2.setOnTouchListener(this);
		view3.setOnTouchListener(this);
		view4.setOnTouchListener(this);
		view5.setOnTouchListener(this);
		view6.setOnTouchListener(this);
		view7.setOnTouchListener(this);
		view8.setOnTouchListener(this);
		view9.setOnTouchListener(this);
		checkBox = (CheckBox) findViewById(R.id.chkAuto);
		checkBox.setOnCheckedChangeListener(this);
		//flipper  등록 
		flipper = (ViewFlipper) findViewById(R.id.viewFlipper);
		flipper.setOnTouchListener(this);
		// flipper의 첫화면은 0 번쨰 화면
		flipper.setDisplayedChild(0);
		FlipperIndex(flipperIndex);
	}

	/**
	 * Flipper의 현재 페이지 수를 알려주는 매소드
	 * @param index : 현재 페이지 인덱스 값 
	 */
	private void FlipperIndex(int index){
		// 페이지 나타내는 이미지뷰 초기화 
		viewb1.setImageResource(R.drawable.b2);
		viewb2.setImageResource(R.drawable.b2);
		viewb3.setImageResource(R.drawable.b2);

		// 인덱스의 값에 따라 해당 이미지뷰에 표시 
		switch(index){
		case 0:
			viewb1.setImageResource(R.drawable.b1);
			break;
		case 1:
			viewb2.setImageResource(R.drawable.b1);
			break;
		case 2:
			viewb3.setImageResource(R.drawable.b1);
			break;
		}
	}

	/**
	 * 체크박스 체크시 자동으로 Flipping이 되는 부분
	 */
	@Override
	public void onCheckedChanged(CompoundButton view, boolean isChecked) {

		// 체크박스 선택시 자동으로 flopping 됨
		if (isChecked == true) {
			//좌우 슬라이드 애니메이션
			flipper.setInAnimation(AnimationUtils.loadAnimation(this,
					R.anim.push_left_in));
			flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
					R.anim.push_left_out));
			// 화면은 3000 밀리세컨 마다 넘어감
			flipper.setFlipInterval(3000);
			flipper.startFlipping();
		} else {
			// 자동 Flipping 해지
			flipper.stopFlipping();
		}
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// 터치의 시작점과 끝점의 차를 구하여 절대 값을 씌운다 
		// 이 값은 사용자가 터치를 한건지 슬라이드를 한건지 알아내기 위해 사용
		
		float temp_differenceVal = xEnd- xStart;
		float differenceVal = Math.abs(temp_differenceVal);
		// 값이 20 미만이면 터치로 인지하고 flipper내의 오브젝트에 터치에 반응
		if(differenceVal < 20){
			// TODO Auto-generated method stub
			switch (v.getId()) {

			case R.id.view1:
				Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_SHORT)
				.show();
				break;
			case R.id.view2:
				Toast.makeText(getApplicationContext(), "2", Toast.LENGTH_SHORT)
				.show();
				break;
			case R.id.view3:
				Toast.makeText(getApplicationContext(), "3", Toast.LENGTH_SHORT)
				.show();
				break;
			case R.id.view4:
				Toast.makeText(getApplicationContext(), "4", Toast.LENGTH_SHORT)
				.show();
				break;
			case R.id.view5:
				Toast.makeText(getApplicationContext(), "5", Toast.LENGTH_SHORT)
				.show();
				break;
			case R.id.view6:
				Toast.makeText(getApplicationContext(), "6", Toast.LENGTH_SHORT)
				.show();
				break;
			case R.id.view7:
				Toast.makeText(getApplicationContext(), "7", Toast.LENGTH_SHORT)
				.show();
				break;
			case R.id.view8:
				Toast.makeText(getApplicationContext(), "8", Toast.LENGTH_SHORT)
				.show();
				break;
			case R.id.view9:
				Toast.makeText(getApplicationContext(), "9", Toast.LENGTH_SHORT)
				.show();
				break;
			}
		}
		
		/*********** Flipper *************/
		if (v != flipper)
			return false;
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			xEnd = event.getX(); 
		} else if (event.getAction() == MotionEvent.ACTION_UP) {
			xStart = event.getX(); 
			
			// 시작, 끝점의 차가 50 이상이면 슬라이드로 인지하고 flipper가 동작함
			if (xStart < xEnd) {
				float difVal = xEnd- xStart;
				if(difVal > 50){
					flipper.setInAnimation(AnimationUtils.loadAnimation(this,
							R.anim.push_left_in));
					flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
							R.anim.push_left_out));

					flipper.showNext();
					flipperIndex = flipper.getDisplayedChild();//flipper의 현재 위치 인덱스를 가져옴 
					FlipperIndex(flipperIndex);//flipper의 현재 위치를 들고 페이지 표시 매소드 호출 
				}
			} else if (xStart > xEnd) {
				float difVal = xStart- xEnd;
				if(difVal > 50){
					flipper.setInAnimation(AnimationUtils.loadAnimation(this,
							R.anim.push_right_in));
					flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
							R.anim.push_right_out));
					flipper.showPrevious();
					flipperIndex = flipper.getDisplayedChild();//flipper의 현재 위치 인덱스를 가져옴 
					FlipperIndex(flipperIndex);//flipper의 현재 위치를 들고 페이지 표시 매소드 호출 
				}
			}
		}
		return true;
		/********** Flipper ****************/
	}
}
슬라이드를 할 때마다 해당 뷰의 인덱스를 받아서 들고있고 그 값을 세개의 페이지 표시 이미지뷰를 컨트롤하는 매소드로 보내어 해당 페이지를 표시할 수 있게 했습니다. 그리고 터치 점과 뗏을때 점의 차를 절대 값으로 구한 뒤 그 값이 20 미만이면 터치로 인식하여 안의 오브젝트가 터치되게 만들고 , 20이상이면 슬라이드로 인식하게하여 뷰 전환이 이루어지도록 하였습니다. 결과물을 이렇게 나옵니다.

posted by 젊은쎄오
:
Android 2011. 11. 22. 17:43
ArrayList를 사용하다보면 중복되는 데이터가 들어갈 때가 있습니다.

이럴 땐 Iterator 라는 패턴을 사용하면 쉽게 걸러낼 수 있는데요

여기를 참고하시면 개념을 잡으실 수 있습니다.

간단하게 array, List, map, set 이런 데이터를 묶어놓은 집합체에 들어있는

원소에 대하여 각각 작업을 할 때 Iterator를 쓰면 원소가 어떤 형식의 집합체에 있던

끄집어 내서 작업을 할 수 있게됩니다.

 
ArrayList List = new ArrayList(); // 검사하려하는 어레이리스트 
ArrayList result_List = new ArrayList(); //결과를 담을 어레이리스트 
HashSet hs = new HashSet(List); 
		
Iterator it = hs.iterator(); 
while(it.hasNext()){ 
	result_List.add(it.next()); 
} 


이런 식으로 사용하면 됩니다. 저 List는 대게 저렇게 선언하지않고 이미 만드신

arrayList 변수가 되겠죠, 그 변수를 Hashset(여기) 에 넣고 돌리게 되면

중복제거가 되어 result_List에 들어가게 됩니다. 이제 result_List안에는

중복데이터가 없는 깔끔한 array가 됩니다. 
posted by 젊은쎄오
:
Android 2011. 11. 2. 15:24
안드로이드 폰은 기기별로 해상도도 다르지만 dpi도 다릅니다. 

안드로이드 소스의 리소스폴더에 가면 drawable 폴더가 각각

drawable-hdpi ,drawable-mdpi ,drawable-ldpi 세가지 폴더가 있습니다. 

이는 좌측부터 240dpi, 160dpi, 120dpi 에 최적화 되어있는 폴더인데요 

기기 dpi를 알고 그 에 맞는 해상도 폴더에 넣어야 제대로 깨짐없이 이미지가 들어갑니다

추가로 320dpi가 최적화인 drawable-xdpi 가 있습니다 .

이 때 필요한 dpi를 알아내는 틀입니다.

 

 
posted by 젊은쎄오
:
Android 2011. 11. 1. 15:09
패키지명을 안다면 바로 삭제화면으로 갈 수 있습니다.

 

이렇게 사용하면 패키지명으로 해당앱 삭제 화면으로 갑니다. song.app 이 패키지 명입니다.

"package:  === "  이것이 틀이구요,  
posted by 젊은쎄오
: