안드로이드 인터페이스 기초 03 - Custom View, Toast, Beep, Vibration, etc

Dora·2020년 11월 5일
0

Chap6. 인터페이스 기초03 - Custom View, Toast, Beep, Vibration, etc

Custom View

: 미리 만들어 놓은 뷰가 아닌 개발자가 직접 모양 및 기능등을 정의하여 만든 뷰.

  • View클래스를 상속받아 필요한 메소드를 재정의하여 사용해야 한다. (오버라이딩 Overriding)
    : XML에서 직접 작성한 View를 사용하기 위해서는 View의 생성자를 모두 재정의해야 한다.

ex.

class MyView extends View {
	public MyView(Context context) {
    		super(context);
        } //기본 생성자
        
        public MyView(Context context, AttributeSet attrs) {
        	super(context, attrs);
        }
        
        public Myview(Context context, AttributeSet attrs, int defStyleAttr) {
        	super(context, attrs, defStyleAttr);
        }
        ...
}

ex1. MainActivity의 내부클래스로 MyView(CustomView)선언하기
(링크)
ex2. CustomView를 XML 레이아웃에 선언하기
(링크)

Custom View 사용시 그리기 절차

  1. CustomView를 생성하여 View 클래스 상속 후 생성자, onDraw() 재정의
  2. onDraw()에 그릴 내용 지정 - Paint 객체 준비 등 (그리기 도구 준비)
  3. Canvas 객체의 메소드 이용 (그릴 공간 준비)
  4. 다시 그릴 땐 customView.invalidate()호출

Canvas 클래스

: 그림을 그리는 영역을 담당하는 클래스

; 시스템에서 제공되는 클래스임.
; View 클래스의 onDraw() 메소드의 매개변수로 전달됨. (전달받은 Canvas 객체를 수정하여 그려지는 모양이 변경된다)

  • 기본 도형 출력 방법
    : Canvas의 멤버 메소드 호출로 기본 도형을 출력할 수 있고, 오버로딩 되어 있으므로 매개변수 확인이 필요하다.
// 점 그리기
void drawPoint (float x, float y, Paint paint)

// 선 그리기
void drawLine (float startX, float startY, float stopX, float stopY, Paint paint)

// 원 그리기
void drawCircle (float cx, float cy, float radius, Paint paint)

// 사각형 그리기
void drawRect (float left, float top, float right, float bottom, Paint paint)

// 텍스트 그리기
void drawText (String text, float x, float y, Paint paint)

Paint

: Canvas에 그림을 그리기 위해 사용하는 펜 역할로 그리기에 대한 속성 정보를 지정한다.

  • 선 경계 부드럽게 출력하기
paint.setAntiAlias(true);
또는
new Paint(Paint.ANTI_ALIAS_FLAG)
  • 색상 변경하기
    • 투명도 지정 : paint.setARGB(int a, int r, int g, int b);
    • 색상 지정 : paint.setColor(Color.RED);

사운드 출력

SoundPool

: 짧은 소리 출력용 (효과음 같은)

; res폴더에 raw폴더 생성 후 sound파일을 복사하여 준비 후 아래코드 실행

SoundPool soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
int sound = soundPool.load(this, R.raw.dingdong, 1);
soundPool.play(sound, 1, 1, 0, 0, 1);

//new SoundPool(maxStreams, STREAM_MUSIC, srcQuality)
//load(context, sound파일주소, priority)
//play(sound, leftVolume, rightVolume, priority, loop, rate)

진동 기능 사용

: 시스템 서비스로부터 Vibrator 객체를 획득하여 진동을 발생 시킨다.

Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(1000); //1초 진동
//또는 vibrator.vibrate(new long[] {100, 50, 200, 50}, 0);
vibrator.cancel();

//vibrate(milliseconds)
//vibrate(new long[] {100, 50, 200, 50}, repeat)

+) AndroidManifest.xml에 permission을 추가해야 한다.

<uses-permission android:name="android.permission.VIBRATE" />

퍼미션 (Permission)

: 기기의 특정 기능을 사용하기 위해 앱이 받는 허가.

; 퍼미션을 받지 않은 상태에서 앱이 특정 기능을 사용할 경우 예외 발생.

정책

  • 보안 위험에 따라 퍼미션 종류를 그룹으로 분류함.
  • 중요한 퍼미션은 실행 중 퍼미션 사용 여부를 사용자가 결정함.

실행 중 퍼미션 확인 및 추가

  1. 필요한 퍼미션을 AndroidManifest에 추가
    ex. 네트워크 퍼미션을 추가한다고 했을 때
    ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION

  2. 퍼미션 필요 위치에서의 퍼미션 확인

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
		!= PackageManager.PERMISSION_GRANTED 
		&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) 
		!= PackageManager.PERMISSION_GRANTED) {
	ActivityCompat.requestPermissions(this, 
		new String[] {Manifest.permission.ACCESS_FINE_LOCATIONS,
		Manifest.permission.ACCESS_COARSE_LOCATION},
		MY_PERMISSION_REQUEST_ACCESS_LOCATION);
	return;
}

// if(조건) { 수행 }

  • Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION
    : 확인 대상 퍼미션

  • ActivityCompat.requestPermissions(...);
    : 퍼미션 확인 요청

  • MY_PERMISSION_REQUEST_ACCESS_LOCATION);
    : 퍼미션 요청 식별 코드 (상수로 선언)


  1. 퍼미션 결과 확인
@Override
public void onRequestPermissionResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
   switch(requestCode) {
    	case MY_PERMISSION_REQUEST_ACCESS_LOCATIONS:
            	if(grantResults.length > 0
			&& grantResults[0] == PackageManager.PERMISSION_GRANTED
			&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
		   Toast.makeText(this, "Permission was granted!!!", Toast.LENGTH_SHORT).show();
		}
		else {
		   Toast.makeText(this, "Permission was denied!!!", Toast.LENGTH_SHORT).show();
		}
		return;
    }
}

사용자의 퍼미션 설정 정보는 내부에 저장되어 유지된다.

profile
Lv.1 개발자

0개의 댓글