안녕하세요 (__) 

이번 주제는 Intellij IDE + SpringBoot Framework 을 이용한 서버 개발입니다. 

 

우선 JetBrains사의 Intellij를 다운받습니다. 

Eclipse와 다르게 판매 하고있는 IDE입니다. 

30일 Trial버전을 이용할 수 있으니 한번 사용해보시길 권장합니다. 


https://www.jetbrains.com/idea/

Ultimate 버전과 Community 버전 중 전 Ultimate버전을 받았습니다.


다운로드 완료 후 설치 진행. 

java, groovy, kt 을 사용할 수 있도록 체크 해줍니다. 

java는 SpringBoot을 사용하기 위해서 필수겠죠. 각 언어의 특성이나 사용법등은 한번쯤 찾아보시길 권장합니다. 

groovy and kt는 선택 안하셔도 됩니다.

 

설치 완료 후 실행 

첫 실행 시 설정정보에 대한 질문을 합니다. 

전 이전 버전 설치가 되어있어서 조금 다를 수도있는데 뭐든 선택하시면 됩니다. 

일단 초기 설치했다는 가정을 위해 이전 설정정보는 가져오지 않는걸로. 


다음은 라이센스 관련 팝업입니다. 

아직 구매를 안했으니 무료 버전으로 실행. 


전 Dracula 테마를 사용하겠습니다. 

테마는 자신의 스타일 대로 변경할 수 있고, 잘 만들어 진 테마를 다운받아 사용 할 수 있습니다. 

그담 오른쪽 아래 플러그인 설정으로

여기서 내가 어떤 작업을 하는지 선택하게됩니다. 

선택에 따라 구성이 달라지겠죠. Custom, Disable을 적절히 선택하시면 됩니다. 

이거저거 관심많으신 분들은 그냥 Next !!

전 관심이 없는 Scala, IDeaVim을 제외하고 모두 install을 하겠습니다. 

*IDeaVim 을 설치하면 단축키가 Vim과 같이 됩니다. Vim에 익숙하지 않은 분은 설치를 하지마세요!!!


전 단축키를 많이 스려고 노력하는 편이라 개발툴이 변경되면 적응하는데 시간이 오래 걸립니다. 그래서 관심있는 것들과 혹시 필요할까? 생각드는 것들을 모두 설치하고 봅니다. 

오른쪽 아래 Start!!!



앞으로 지겹도록 보게될 로딩 화면이 나타나게 됩니다. 


 


Posted by 천류성

Gradle 추가. 

compile 'com.github.bumptech.glide:glide:3.7.0'


Option Module 추가(3.5버전 이후 변경된 방식). 

Diskcache, Memory Cache 사용. 

기본 ARGB_8888 형식으로 변경 (4444 default). 

public class MyGlideModule implements GlideModule {
private final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
private final int cacheSize = maxMemory / 8;
private final int DISK_CACHE_SIZE = 1024 * 1024 * 10;

@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, "cache", DISK_CACHE_SIZE))
.setMemoryCache(new LruResourceCache(cacheSize))
.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888)
;
}

@Override
public void registerComponents(Context context, Glide glide) {

}
}


AndroidManifest.xml Module meta-data 추가.

<meta-data
android:name="package.MyGlideModule"
android:value="GlideModule" />


간단한 사용 방법 : 

Glide.with(fragment.getContext())
.load(url)
.into(view);
  • Gif 사용가능. 
  • Animation 추가 가능.
  • thumbnail 형식 이미지 변환가능. 
  • 기타 등등 다양한 기능. 


참조 : https://github.com/bumptech/glide

Posted by 천류성

TextView.setInputType(EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

Posted by 천류성

Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

String[] projection = new String[] {

String[] projection = new String[] { ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.PHOTO_ID, ContactsContract.Data.RAW_CONTACT_ID };

Cursor contactCursor = managedQuery(uri, projection, null, null, null);
사진 가져오기 
contactId = ContactsContract.CommonDataKinds.Phone.CONTACT_ID의 값

public Bitmap getPhoto(Long contactId) {
Uri contactPhotoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
InputStream photoDataStream =                                             Contacts.openContactPhotoInputStream(getContentResolver(),contactPhotoUri); 
Bitmap photo = BitmapFactory.decodeStream(photoDataStream);
return photo;
}

연락처 사진 변경.
rawContactId = ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID 의 값

public static void setContactPhoto(ContentResolver c, byte[] bytes, long rawContactId) {

ContentValues values = new ContentValues();
int photoRow = -1;
String where = ContactsContract.Data.RAW_CONTACT_ID + " = " + rawContactId + "                     AND " + ContactsContract.Data.MIMETYPE + "=='" +             ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'";
Cursor cursor = c.query(ContactsContract.Data.CONTENT_URI, null, where, null, null);
int idIdx = cursor.getColumnIndexOrThrow(ContactsContract.Data._ID);
if (cursor.moveToFirst()) {
photoRow = cursor.getInt(idIdx);
}
cursor.close();

values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
if (photoRow >= 0) {
c.update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data._ID + " = " + photoRow, null);
} else {
c.insert(ContactsContract.Data.CONTENT_URI, values);
}

}

Posted by 천류성

ICS부터 android.provider.calendar 접근이 가능해 Canlendar DB를 사용하기 쉽다. 

calendar provider를 접근하지 못하는 이전 버전에서의 사용법. 

2.2 이상인 경우 
String targetProvider = "com.android.calendar"
2.2 미만인 경우 
String targetProvider = "calendar" 

ContentResolver contentResolver = getContentResolver();
String eventUri = String.format("content://%s/events", targetProvider);
String selectUri = String.format("content://%s/", targetProvider); 

//검색
Cursor cursor = contentResolver.query(Uri.parser(selectUri+"/calendars"), ......);
 //입력, 수정, 삭제
Uri uri =  ContentUris.withAppendedId(Uri.parse(eventUri), id));
contentResolver.update(uri, ....); 

All day추가 시
UTC 타임으로 추가 되며 당일 00시00분 부터 다음날 00시 00분으로 추가 됨.

 반복 이벤트 추가 시 
 rrule(icalendar 규칙) 과 반복 되는 시간 duration column을 추가.

 반복 이벤트 수정 시 
instance table의 start 시간과 _sync_id 컬럼을 이용해 originalInstanceTime, originalEvent 를 채움.
반복 이벤트 수정, 삭제 동작은 event table에 상황에 맞는 이벤트 추가로 반영 됨.(수정, 삭제 -> event row 추가)
Posted by 천류성
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
float step  = e2.getX() - e1.getX();
float dest = (step*2);                          // 좌/우  Flicking 시 +/-로 변경 됨.
return super.onFling(e1, e2, dest, velocityY);
}

붉은 부분의 연산은 상황에 맞도록 수정 하시면 됩니다.
 
Posted by 천류성

프로젝트 초기 배경이 없는 이미지를 Composite에 투명이미지를 올려 놓으면 Composite의 태두리가 남아 투명한 이미지를 사용하지 못했다.

Composite의 시작 좌표부터 크기만큼 Composite이 올라가는 배경이미지를 그린다음 Composite에 투명 이미지를 그려서 투명한 효과를 냈다.

그렇게 사용하다 SWT API를 보니 TRANSPARENT를 발견했다.
SWT 3.4버전 부터 사용가능한 투명화 메소드.

사용방법도 간단하다 SWT style에 SWT.TRANSPARENT를 추가하면 Composite에 한해 투명해지게 된다.

label은 투명이 안된다. 1~2개월 전에 테스트 했으니 지금도 안될 것 같다.

SWT는 Swing과 달리 개발 진행이 한창인 것 같다.

Posted by 천류성

이번 프로젝트를 진행하면서 SWT에 대해 많은 부분을 알게되었다.

많은 삽질을 통해 많은 걸 배웠는데. 정리 할 시간없이 내 기억속에서 사라져간 내용들이 많다.

먼저 동적 이미지 사용하기.

Swing은 동적 이미지 .gif를 불러오면 동적 이미지를 사용 할 수있다.

SWT는 gif파일을 불러오면 정지된 이미지를 불러온 것과 같은 이미지가 나온다. 결론은 움직이는 gif파일이 자기 역활을 못 한다.
이유는 생각 할 시간이 없었다. -_-;; 코피터지는 일정에 안되니까 되는 방법을 찾았다.

이미지를 순차적으로 그려주면 된다.
이걸 파일로 만들어 둔게 움직이는 이미지 파일이니까.

먼저 움직이는 이미지를 표현할 이미지들이 필요하다.

Composite을 상속받은 클래스를 생성하고 

 private void initImg() {
  this.setSize(35, 35);
  setLayout(null);

  img = new Image[6];

  img[0] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_1();
  img[1] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_2();
  img[2] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_3();
  img[3] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_4();
  img[4] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_5();
  img[5] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_6();


  if(!compo.isDisposed()){
   this.addPaintListener(new PaintListener() {
    public void paintControl(PaintEvent e) {
     if (null != frameImage) {
      e.gc.drawImage(frameImage, 0, 0);
     }
    }
   });

  }
 }
 public void setData(int ImageNum){
  if(ImageNum < 7){
   frameImage = img[ImageNum];
  }
 }
<이 코드는 프로젝트 진행중에 작성된 코드의 일부분이다.>

배열이 이미지를 등록해두고 Thread가 동작하면서 frameImage에 차래로 이미지를 끼우고 그 이미지를 Canvas에 있는 gc가 그려준다.

Thread의 모습

 private synchronized void threadExe() {
  while (flag) {
   try {
    Thread.sleep(500);
   } catch (InterruptedException e) {
    
   }
   try{

    if (!_fanMoveImage.isDisposed()) {
     _fanMoveImage.getDisplay().asyncExec(new Runnable() {
      public void run() {

       if (!_fanMoveImage.isDisposed()) {
        _fanMoveImage.setData(j);
        _fanMoveImage.redraw();
       }
       // }
      }
     });
    }
   }catch(SWTException e){
    e.printStackTrace();
   }
    j = j + 1;
    if (j == 6) {
    j = 0;
    }
  }
 }
 
 public void setCoolingTowerFanStatus(boolean flag){
  this.flag = flag;
  
 }

  _fanMoveImage.setData(j); 순차적으로 숫자를 setData에 넣음으로 frameImage에 이미지가 변경된다. 그리고 외부에서 flag를 제어 함으로 Thread를 멈출 수 있게한다.

SWT를 많이 사용해 보고 프로젝트를 진행한게 아니라 프로젝트 진행을 하면서 SWT에 대해서 배우고있다.

아직은 SWT의 장점을 잘 모르겠다. 익숙한 Swing으로 했다면 지금 불편하게 작성한 코드들을 좀더 쉽게 작성했지 않았나라는 생각을 한다.
SWT를 잘 다루는 사람들의 책을 읽고 그들의 방식대로 사용을 해 본후의 생각은 지금의 생각과 다를 거라고 생각을해본다.

Posted by 천류성


     Runnable longJob = new Runnable() {
             boolean done = false;

             int id;

             public void run() {
               Thread thread = new Thread(new Runnable() {
                public void run() {
                   display.syncExec(new Runnable() {
                     public void run() {
                      try{
                       Thread.sleep(5000);
                      }catch(Exception e){
                      
                      }
                     }
                   });

                   done = true;
                   display.wake();
                 }
               });
               thread.start();
               while (!done && !compo.isDisposed()) {
                 if (!display.readAndDispatch())
                   display.sleep();
               }
             }
           };
           BusyIndicator.showWhile(display, longJob);


출처 : Java2s.com
본문에서 약간 수정한 부분이 있습니다.

Posted by 천류성
이전버튼 1 2 3 이전버튼

블로그 이미지
.....
천류성

태그목록

공지사항

Yesterday0
Today1
Total15,757

달력

 « |  » 2018.12
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

최근에 달린 댓글

최근에 받은 트랙백

글 보관함