https://github.com/wasabeef/awesome-android-ui

안드로이드 UI/UX개발 시 참고할 수 있는 git 페이지.

각 라이브러리 링크와 라이센스, 데모 움짤 등으로 이루어져있고, 업데이트도 충실한 편입니다.

Posted by 안드로메다에서 온 프로그래머

댓글을 달아 주세요

아파치 라이브러리를 사용하면 객체를 쉽게 직렬화/역직렬화 할 수 있습니다.

*주의 : 직렬화 할 객체는 반드시 implements Serializable 해 준 상태여야 합니다.


직접 만든 객체를 한 줄로 직렬화 해 봅시다.

byte[] data = SerializationUtils.serialize(yourObject);


역직렬화도 한 줄로 해 봅시다.

YourObject yourObject = (YourObject) SerializationUtils.deserialize(byte[] data)


안드로이드 스튜디오에서 아파치 라이브러리를 사용하려면,

인터넷이 연결된 상태에서 build.gradle의 dependencies에 아래와 같이 한 줄 추가해 주고 sync 하면 됩니다.

compile 'org.apache.commons:commons-land3:3.4'


라이브러리의 라이센스는 아파치 2.0. 따라서 출처 표기 후 상업적 이용도 가능하며,

아파치 라이브러리에는 각종 변환수식이나 프로토콜 관련해서 좋은 유틸이 많으므로 유용하게 사용합시다.


참고 : https://stackoverflow.com/questions/2836646/java-serializable-object-to-byte-array

Posted by 안드로메다에서 온 프로그래머

댓글을 달아 주세요

Android Material Icon Generator 

디자이너 없이 마테리얼 간단한 마테리얼 아이콘을 만들 수 있는 웹 도구


상당수의 디폴트 아이콘을 사용하여 제작하거나, 

가지고 있는 SVG 아이콘을 마테리얼 아이콘으로 변환할 수 있습니다.


생성된 아이콘의 라이센스는 CC BY. 출처 표기 후 상업적 이용도 가능.

단, 샘플 아이콘 리소스를 그대로 사용했을 경우는 Apache 2.0이 적용됩니다.

그 외에 생성기 자체의 라이센스도.. 이거 라이센스 고지가 은근히 복잡해서 나중에 한번 더 정리할 예정입니다.


웹 버전 : http://bitdroid.de/Android-Material-Icon-Generator/

오픈소스 : https://github.com/Maddoc42/Android-Material-Icon-Generator

'개발자 > 미분류' 카테고리의 다른 글

3축 자이로 센서보드 예제  (0) 2013.12.06
JSON을 알아봅시다  (0) 2013.07.15
Posted by 안드로메다에서 온 프로그래머

댓글을 달아 주세요

안드로이드에서 텍스트뷰를 사용해 보면 텍스트 뷰 내뷰에 기본 패딩이 있어

디자인 요구사항을 정확히 반영할 수 없는 경우가 있습니다.

다음과 같이 패딩을 제거해 줄 수 있습니다.


xml에서 적용

<TextView
    android:id="@+id/textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:includeFontPadding="false"/>
cs



코드에서 적용

java

textView.setIncludeFontPadding(false);
cs


c#

textview.SetIncludeFontPadding(false);
cs


코드나 xml 중 한 곳만 적용해 주면 됩니다.

적용한 모습이 기본 패딩이 사라진 텍스트뷰인데 이래도 요구사항에 맞지 않는다면,

추가로 마이너스 패딩을 주는 방법 등도 있으나 추천하는 방법은 아닙니다.



16년 12월 추가 : android:includeFontPadding="false" 가 Default 로 이미 적용되어 있는 경우도 있는 것 같습니다. 패치로 인한 것인지 특정 상황에서 그런 것인지는 아직 확인하지 않았습니다. 애매한 건 명시적으로 코딩하는게 좋으니 확인시까진 매번 false로 설정할 생각합니다.


참고 : https://developer.android.com/reference/android/widget/TextView.html


Posted by 안드로메다에서 온 프로그래머

댓글을 달아 주세요

final View view = View;
...
view.post(new Runnable() {
            @Override
            public void run() {
                view.getHeight(); //height is ready
            }
        });

Java에서는 new Runnable등을 이용해 익명 클래스를 사용할 수 있습니다.

하지만 C#은 '일단은' 익명 클래스를 허용하지 않습니다. 

그럼 이런 코드는 Xamarin.Android에서는 어떻게 사용할까요?


private IRunnable fRunnable;

view.Post(fRunnable);

fRunnable = new Runnable(() => {

    view.Height;

});

일단 이런 식으로 IRunnable를 사용해서 뭔가 기분은 이상하지만 일단 구현은 가능합니다(..) 

당장 급하실때만 사용 해 주세요.


Posted by 안드로메다에서 온 프로그래머

댓글을 달아 주세요

Manifests

Xamarin.Android의 Manifests설정은 Java와 약간, 아니 좀 많이 다릅니다.

Java Manifests의 <activity ~ /> 부분이 아래와 같이 사실상 각 cs파일 상단에 들어간다고 생각하시면 됩니다.

[Activity(Label = "자마린 ㄴㄴ", MainLauncher = true, Icon = "@drawable/icon")]

Xamarin으로 Android를 처음 만난 분을 위해 설명하자면,

Lable은 액티비티의 타이틀, MainLauncher는 앱 시작 페이지를 이 액티비티로 지정(당연히 true지정된 액티비티는 한 앱에 하나만 존재해야 합니다, Icon은 액티비티의 아이콘입니다.


Button

//버튼 선언

Button button = FindViewById<Button>(Resource.Id.Button);

//클릭 이벤트 등록은 자바의 리스너가 아닌 Event방식을 사용합니다

//이벤트 등록 방식 1번 button.Click += (object sender, EventArgs e) => {     Console.WriteLine("button이 눌러졌습니다"); //로그에 찍힙니다. log.d도 가능. };


//이벤트 등록 방식 2번, delegate를 이용해 간단한 처리를 한줄에 구현합니다.

button.Click += delegate { Console.WriteLine("button이 눌러졌습니다"); };


//이벤트 등록 방식 3번, OnCreate등에서 이벤트 메소드만 지정하는 방식입니다

//여러 버튼이 하나의 동작을 공유하는 것도 가능합니다

button.Click += button_Click;

void button_Click(object sender, EventArgs e)

{

//동작

}


//응용. 리스트뷰의 경우.

listView.ItemClick += delegate(object sender, AdapterView.ItemClickEventArgs e) \

{

//응용2. 클릭된 아이템의 text를 얻는다. custom ListView일 경우에는

//GetItemAtPosition의 재정의가 필요.

String text = listView.GetItemAtPosition(e.Position);

};


Dialog

//translatedNumber이라는 변수에 저장된 번호로 전화거는 다이얼로그 예제

var callDialog = new AlertDialog.Builder(this);

callDialog.SetMessage("Call" + translatedNumber + "?");//이 번호로 전화할건가?셋 메세지 callDialog.SetNeutralButton("Call", delegate {     var callIntent = new Intent(Intent.ActionCall);//전화 인텐트 callIntent.SetData(Android.Net.Uri.Parse("tel:" + translatedNumber)); StartActivity(callIntent); });


//List형식의 다이얼로그 예제


string[] titleMenu = { "사과", "메론" };

AlertDialog.Builder alert = new AlertDialog.Builder(activity);

alert.SetTitle("먹을 과일 선택"); //제목

alert.SetItems(titleMenu, (o, e) => //object, sender

{ // ↑ string xml 파일의 리스트를 여기에 써 줘도 됩니다.

//사과0,메론1

if (e.Which == 0)

{

System.Console.WriteLine("사과를 먹었습니다");

}

else if (e.Which == 1)

{

System.Console.WriteLine("메론을 먹었습니다");

}

});

alert.Show();


//다이얼로그 밖을 터치해서 닫을 수 있는 다이얼로그

//당연히 그런 거 아니야? 라고 생각할 수 있지만, Create 없이 그냥 바로 생성하면

//일부 안드로이드 버전에선 잘 되는데 일부에선 해당 기능이 동작하지 않는다....

//고객에게 간 버전에서만 안 될수 있다는 이야기.

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.SetTitle("정말 삭제하시겠습니까?");

builder.SetPositiveButton("예", delegate{ //positive work });

builder.SetNegativeButton("아니오", delegate { });

AlertDialog alert = builder.Create();

alert.SetCancelable(true);//취소 가능한 다이얼로그로 설정

alert.SetCanceledOnTouchOutside(true);//화면 밖을 터치해서 취소가 가능하게 설정

alert.Show();



다이얼로그 참조 링크 여기


기타 Java로 Android 개발하던 개발자가 C#으로 개발할 때 헷갈릴만한 사항들 메모.


커스텀 레이아웃 네임스페이스는 apk/res 가 아닌 apk/lib를 써야 한다

xmlns:yourApp="http://schemas.android.com/apk/lib/com.yourAppPackege.yourClass"


xml에서 커스텀 레이아웃을 사용할때는 네임스페이스를 사용해야 한다

패키지.경로.클래스명

EAppAndroid.Protype.LeftDrawerMenu2 

<EAppAndroid.Protype.LeftDrawerMenu2.OpendCheckLinearLayout



프래그먼트에서 어레이 어댑터 만들기

 ArrayAdapter adapter = new ArrayAdapter<string>(Activity,Android.Resource.Layout.SimpleListItem1, items);

다음과같이 this가 아닌 Activiti로 해줘야 한다

참고 http://arteksoftware.com/androids-built-in-list-item-layouts/

Posted by 안드로메다에서 온 프로그래머

댓글을 달아 주세요

Google Dvelopers - Training

http://developer.android.com/training/index.html

 

Google Dvelopers - BitmapFactory class

http://developer.android.com/reference/android/graphics/BitmapFactory.html

 

녹두장군님 블로그 - 비트맵을 스케일 조정하여 로딩

http://mainia.tistory.com/468

 

커니의 안드로이드 이야기 - 안드로이드의 파일 입출력에 필요한 경로를 얻는 방법 총정리

http://androidhuman.tistory.com/432

 

카메라 호출 후 넘어오는 intent.getData()가 null이거나 썸네일 Bitmap일결우 해결법

http://japanescape.tistory.com/14

원본포스팅

http://blog.naver.com/free2824/60199479410

위 포스팅의 문제점 : 4.4 킷켓에선  Ex메모리 권한 없음,

내장메모리 사용해야 함. 그런데 카메라는 외부 App 이므로 해당 App 내장영억 접근 권한이 없음

Posted by 안드로메다에서 온 프로그래머

댓글을 달아 주세요

간단하게 텍스트 파일에 아래와 같은 CPU,RAM,메인보드 정보가 있다고 해보자

101 Intel i3 110000
102 Intel i5 200000

201 DDR3 4G 40000
202 DDR3 8G 80000

301 ASRock B85M 80000
302 ASUS H87 130000

item.txt

 

파일 오픈을 해보자!

 

try {  //예외 처리는 기본으로 해 줘야 한다

//파일에서 스트림을 통해 주르륵 읽어들인다

BufferedReader in = new BufferedReader(new FileReader("item.txt"));

 

//요 s에다가 한 줄씩 읽어 올거다

String s;

  

//반복한다! 언제까지? s에 앞서 읽어온 in이라는 문자 스트림에서 한 줄을 읽어 오는게 실패할 때까지!

while ((s = in.readLine()) != null) {

//그렇게 한 줄 가져와서.. 스플릿으로 조각조각 내 준다. 파싱 기준은 공백인 \t 로 하자

String[] split = s.split("\t");

 

//아래 변수들은 클래스에 선언되어 있음을 가정한다

modelcode = Integer.valueOf(split[0]); //첫째 조각은 모델 코드에
modelname = split[1]; //둘째 조각은 모델 네임에
modelprice = Integer.valueOf(split[2]);//셋째 조각은 모델 가격에 입력한다

 

 //전제조건

 //list는 ArrayList이다, Model은 컴퓨터 부품을 저장할 붕어빵 트....ㄹ 이 아니고 클래스다

 

 //그 후 적절한 리스트나 자료구조에 투입한다!

      list.add(new Model(modelcode, modelname, modelprice));

      }

      //다 뽑아먹었으니 버퍼리더를 닫아 준다.
      in.close();
      } catch (IOException e) {

  //혹시 입출력 에러가 발생했다면 어떤 에러인지 출력하고 끄자.

  System.err.println(e);

  System.exit(1);

}

 

결과적으로 list라는 ArrayList에 Model이란 클래스 구조로 txt파일 내용이 들어갔다!

해피엔딩

 

 

Posted by 안드로메다에서 온 프로그래머

댓글을 달아 주세요

오늘 내 30분을 잡아먹은 상황에 대한 대처법을 포스팅하려 한다

 

jdk를 막 설치했거나 설치하고 나서 잘 사용하던 도중

cmd창에서 java 명령어나 java -version 명령어는 잘 먹히는데, javac 명령어만 안 먹힐 때가 있다.

다른 증상으로는 잘 돌아가던 이클립스나 안드로이드 스튜디오에서 JAVA_HOME관련 에러를 뿜기도 한다

 

증상이 발생했다면 환경변수 path를 살펴보자, 중간에 못 보던 게 있다

C:\ProgramData\Oracle\Java\javapath;

오라클 DB를 설치하다 생긴건지.. 이 경로가 추가된 원인은 잘 모르겠으나,

경로로 들어가 보면 java , javaw, javaws의 바로가기만 덜렁 있다.

요놈이 최상위 경로로 들어가서 %JAVA_HOME% 의 내용물을 찾질 않는 문제인 것이다

 

그냥 path에서 저 C:\ProgramData\Oracle\Java\javapath; 를 지워주고,

해당 프로그램이나 cmd를 재시작하면 잘 된다.

원래 프로그램에도 별 영향 없을 듯, 어차피 새로운 path인 %JAVA_HOME%이 상위 호환이기에.

 

 

Posted by 안드로메다에서 온 프로그래머

댓글을 달아 주세요

float rand_FloatRange(float a, float b){
    return ((b-a)*((float)rand()/RAND_MAX))+a;
}

랜덤 시작 범위 a, 랜덤 마침 범위 b

 

-2~2 사이의 모든 실수를 랜덤 제네레이트 하고 싶다면

 

rand_FloatRange(-2,2);

 

랜덤 넘버를 연속으로 뽑다 보면 같은 넘버가 발생함.

srand(GetTickCount());으로 밀리초 단위로 생성하고

Sleep(5);으로 넘버를 뽑을 때마다 딜레이를 주면 해결

Posted by 안드로메다에서 온 프로그래머

댓글을 달아 주세요