2019.02.13 00:48


[Android] calling ui thread from worker thread



Method compress must be called from the worker thread, currently inferred thread is UI thread less... (Ctrl+F1)  

Inspection info:Ensures that a method which expects to be called on a specific thread, is actually called from that thread. For example, calls on methods in widgets should always be made on the UI thread


위와 같이 View와 같은 Class내에서 Bitmap Compress 함수 사용시

Activity의 context 의 runOnUiThread 에서 수행해주도록 아래와 같이 구현한다.


public static Bitmap croppedBitmap;
public static File croppedFile;

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdCard.getAbsolutePath() + "/" + Data.PIC_FOLDERNAME + "/" + Data.PIC_FILENAME);
if (dir.exists() == false) {
dir.mkdir();
}

String path = sdCard.getAbsolutePath() + "/" + Data.PIC_FOLDERNAME + "/" + Data.PIC_FILENAME + "/" + Data.CROP_FILENAME;
croppedFile = new File(path);

((CropActivity) getContext()).runOnUiThread(new Runnable() {
public void run() {
// things need to work on ui thread
Bitmap croppedBitmap = CropImageView.croppedBitmap;
FileOutputStream out;
try {
out = new FileOutputStream(croppedFile);
croppedBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
} catch (Exception e) {
e.printStackTrace();
}
}
});


아래와 같이  UI Thread 이용하며 CropActivity는 위의 코드가 동작하는 View와 같은 Class가 호출되어 Activity 로 동작하는 Class 이다.

    ((CropActivity) getContext()).runOnUiThread(new Runnable() {
public void run() {
// things need to work on ui thread


}
});







Posted by injunech
2019.02.09 19:02


Google Android Sample Code Git

구글 안드로이드 샘플 코드 Git


Google Samples

https://github.com/googlesamples



Google Play In-app Billing Samples

https://github.com/googlesamples/android-play-billing






Posted by injunech
2019.02.04 21:36


구글계정 지급보류 문제해결


구글 개발자 계정에서 아래와 같은 에러 문구가 발생하는 경우

구글에 문의를 해서 원인 확인과 해결요청을 해야 한다.


은행 계좌가 잘못된 경우라면 쉽게 해결되지만 그밖에 경우라면 복잡하고 오래 걸리기 때문에

이러한 문제가 발생한 즉시 구글에 문의를 하는것이 좋다.


Contact us about your payments account status

You're currently unable to receive payouts because there's a hold on your payments account.




상단 물음표를 눌러서 구글 지원팀에 이메일로 문의하기 요청하고

관련 내용에 대해 문의요청한다.




혹은 위와 같이 Google Play Console 지원팀에 문의하기를 통해

채팅/이메일 두가지 방법을 선택해서 확인 요청할수 있다.




Posted by injunech
2019.01.06 03:00


TextView 줄간격, 자간, 장평 설정하기


ㆍ 줄간격 : lineSpacingExtra, lineSpacingMultiplier

ㆍ 자간 : letterSpacing

ㆍ 장평 : textScaleX



줄 간격


android:lineSpacingExtra ="0dp"(기본)


android:lineSpacingExtra ="5dp"


android:lineSpacingMultiplier="1"(기본)


android:lineSpacingMultiplier="1.5"




자간


android:letterSpacing="0"(기본)


android:letterSpacing="0.2"


장평


android:textScaleX="1"(기본)


android:textScaleX="1.5"(기본)







Posted by injunech
2018.12.26 01:41


스크롤바(ScrollBar) 색상, 위치 변경해보기


ㆍ스크롤바의 위치와 색상 설정 방법.


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

<ScrollView
android:layout_width="300dp"
android:layout_height="300dp">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="어쩌구"
android:textColor="#000000" />
</ScrollView>

</LinearLayout>


스크롤바를 항상보이게 하기

android:scrollbarFadeDuration = "0"
android:scrollbarAlwaysDrawVerticalTrack = "True"

혹은

android:scrollbarDefaultDelayBeforeFade="500000"


스크롤바 위치를 우측에서 좌측으로 바꾸기

android:VerticalScrollbarPosition = "left"


스크롤바가 밖으로, 내부 콘텐츠를 가리지 않도록 설정하기

android:scrollbarStyle="outsideInset"


스크롤바를 원하는 그림으로 변경하기, Size 변경하기


android:scrollbarThumbVertical="@drawable/scroll_thumb"
android:scrollbarSize="2dp"

스크롤바 배경 라인 변경하기


android:scrollbarTrackVertical="@drawable/scroll_track"



















Posted by injunech
2018.05.13 21:48


[Android] Handler Message obj 전달 (what, arg1, arg2)

android.os.Handler 를 이용해서 다른 쓰레드에서의 UI를 핸들링 하려면 Message object 를 전달하여 Handler 내부에서 처리한다.


안드로이드에서 작업시 통신이나 기타 작업을 위해서 쓰레드를 이용하는 경우에 타 쓰레드에서 액티비티 등의 UI 를 변경할 경우 android.os.Handler 를 사용하게 됩니다.


Handler 클래스를 Activity 클래스 내에서 정의 해 줍니다.

Handler handler = new Handler() { // 메인에서 생성한 핸들러
@Override
public void handleMessage(Message msg) {
if(msg.what == 0){
// 메세지를 통해 받은 값을 TextView에 출력
textView.setText("arg1="+msg.arg1);
textView.setText("arg2="+msg.arg2);
}
}
};


쓰레드에서 액티비티의 UI 를 변경해야 할 경우 액티비티의 핸들러에게 메시지를 보냅니다. 쓰레드로 핸들러 인스턴스를 넘겨주는 방법은 각자 필요에 맞게 넘겨주면 됩니다.

// obtain 메소드로 메세지 생성
Message msg = Message.obtain(mHandler, 0, arg1, arg2);
mHandler.sendMessage(msg); // 메인스레드의 핸들러에 메세지 보내기





Posted by injunech
2018.05.08 16:56


[Android] Layout겹치기


윈도우는 빈 채로 생성되며 빈 윈도우 안에 레이아웃을 채워 넣어 UI를 구성하는데 이때는 다음 메소드를 호출 한다.

 

void setContentView(int layoutResID)

void setContentView(View view, [ViewGroup.LayoutParams params])

void addContentView(View view, ViewGroup.LayoutParams params)

 

다음 예제는 2개의 xml파일을 겹쳐서 보여주는 예제이다.

 

overlay1.xml

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

 

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="바닥 레이아웃" />

    <Button

     android:layout_width="wrap_content"

     android:layout_height="wrap_content"

     android:text="바닥의 버튼"

     />

 

</LinearLayout>

 

overlay2.xml

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

    android:gravity="center"

    android:background="#40ffff00"

>

    <TextView

     android:layout_width="wrap_content"

     android:layout_height="wrap_content"

     android:text="이것은 위쪽의 레이아웃 입니다."/>

 

    <Button

     android:layout_width="wrap_content"

     android:layout_height="wrap_content"

     android:text="위쪽 버튼"/>

 

</LinearLayout>

 

Overlay.java

 

package com.example.overlay;

 

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.Window;

import android.widget.LinearLayout;

 

public class Overlay extends Activity {

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        Window win = getWindow();

        win.setContentView(R.layout.overlay1);

        

        //전개자로 xml파일을 가져옴

        LayoutInflater inflater = (LayoutInflater)getSystemService(

                Context.LAYOUT_INFLATER_SERVICE);

        LinearLayout linear = (LinearLayout)inflater.inflate(R.layout.overlay2null);

          

        //파라미터를 세팅해줌

        LinearLayout.LayoutParams paramlinear = new LinearLayout.LayoutParams(

                LinearLayout.LayoutParams.MATCH_PARENT,

                LinearLayout.LayoutParams.MATCH_PARENT

                );

        

        //윈도우에 추가시킴

        win.addContentView(linear, paramlinear);

        

        

    }

 

 

}

 

실행화면

 

아래쪽 레이아웃은 위쪽 레이아웃 때문에 색상이 약간 변한다. 하지만 두 버튼은 독립적으로 동작해서 클릭 리스너를 추가 시킬 수 있다.





출처: http://gakari.tistory.com/entry/안드로이드-LayoutInflater를-활용한-레이아웃-겹치기 [가카리의 공부방]



Posted by injunech
2018.04.15 01:59


Android Studio build error about gradle

Could not find com.android.tools.build.gradle:3.0.0-alpha7


위와 같이 gradle 버전을 찾지 못할때

자신의 android studio 설치 폴더상의 gradle 버전을 확인해서 build.gradle 상에 설정해준다.


 

  1. open the file path(just as the log said): file:/C:/Users/dmin/Documents/android-studio/gradle/m2repository/com/android/tools/build/gradle/
  2. found this file

  3. just change classpath 'com.android.tools.build.gradle:3.0.0-alpha7' to classpath 'com.android.tools.build.gradle:* * * ' ; * * * is the exist gradle file;

  4. buildscript {
      repositories {
        ...
        // You need to add the following repository to download the
        // new plugin.
        google()
      }
    
      dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-alpha5'
      } 
    }







Posted by injunech
2017.02.19 01:07


Color 지정방법에 대한 다양한 방법 소개


You can use various functions from the Color class to get the same effect of course.

  • holder.text.setTextColor(Color.RED);

  • Color.parseColor (Manual) (like LEX uses)

    text.setTextColor(Color.parseColor("#FFFFFF"));
  • Color.rgb and Color.argb (Manual rgb) (Manual argb) (like Ganapathy uses)

    holder.text.setTextColor(Color.rgb(200,0,0));
    holder.text.setTextColor(Color.argb(0,200,0,0));
  • And of course, if you want to define your color in an XML file, you can do this:

    <color name="errorColor">#f00</color>

    because the getColor() function is deprecated1, you need to use it like so:

    ContextCompat.getColor(context, R.color.your_color);
  • You can also insert plain HEX, like so:

    myTextView.setTextColor(0xAARRGGBB);

    Where you have an alpha-channel first, then the color value.

Check out the complete manual of course, public class Color extends Object.


https://developer.android.com/reference/android/graphics/Color.html#parseColor(java.lang.String)





Posted by injunech
2016.09.23 01:26


ListView를 보시면 화면을 터치한 후 드래그하는 속도에 따라 ListView의 스크롤링 속도가 변하는 것을 볼 수 있습니다. 천천히 하면 스크롤도 천천히 되고 빠르게 드래그하면 바퀴 돌 듯이 ListView가 스크롤 되지요. 이런 효과는 어떻게 구현될 수 있을까요? 안드로이드에서 제공하는 클래스를 통해 쉽게 구현할 수 있습니다. 다음의 코드를 보시죠.


public class MyOnTouchListener implements OnTouchListener {

    private VelocityTracker mVelocityTracker;

    public boolean onTouch(View v, MotionEvent event) {

        if (mVelocityTracker == null) {

            mVelocityTracker = VelocityTracker.obtain();

        }

        mVelocityTracker.addMovement(event);


        switch (event.getAction()) { 

        case MotionEvent.ACTION_DOWN:

            Log.v(TAG"ACTION_DOWN");

            break



        case MotionEvent.ACTION_MOVE:

            Log.v(TAG"ACTION_MOVE");

            mVelocityTracker.computeCurrentVelocity(1);

            float velocity = mVelocityTracker.getXVelocity();

            break


        case MotionEvent.ACTION_UP:

            Log.v(TAG"ACTION_UP");

            if (mVelocityTracker != null) {

                mVelocityTracker.recycle();

                mVelocityTracker = null;

            }

            break

        } 

        return true;

    }

}


요점은 VelocityTracker가 드래그의 속도를 측정해준다는 것입니다. 위의 예제에서는 VelocityTracker의 5가지 메소드가 사용되었습니다.

1. obtain()
   이것은 정적 메소드입니다. VelocityTracker의 인스턴스를 구하기 위한 팩토리 메소드입니다.
2. addMovement(MotionEvent e)
   속도를 측정하기 위해서 VelocityTracker 인스턴스에 MotionEvent를 입력합니다.
3. computeCurrentVelocity(int unit)
   입력된 데이타를 기반으로 속도를 측정합니다. unit은 측정 시간 단위이며 1은 1밀리초를, 1000은 1초를 의미합니다. 다시 말해 unit이 1이라면 1밀리초동안의 픽셀단위의 이동 거리를 측정합니다.
4. getXVelocity()
   X축으로의 속도를 구합니다. Y축으로의 속도는 getYVelocity()를 사용하면 됩니다. 
5. recycle()
   객체를 재사용할 수 있도록 초기화 합니다.
   드래깅 속도 측정은 빈번하게 일어나는 연산입니다. 하지만 이를 위해서 각각의 OnTouchListener가 VelocityTracker의 인스턴스를 하나씩 점유하는 것은 분명 낭비입니다.(안드로이드는 임베디드 시스템을 위한 운영체제임!) 따라서 VelocityTracker 객체의 생성은 팩토리 메소드에 위임하고 객체는 사용 후 반환합니다. 그러면 결과적으로 VelocityTracker 객체 하나가 모든 드래깅 동작에 공유되어 사용될 수 있습니다. 




출처 : http://anddev.tistory.com/16




Posted by injunech