1. 진동 함수
진동 테스트는 무척 단순합니다.
진동을 일으키는 방법은 3가지가 있습니다.
첫째는 정해진 시간 만큼 한번 작동시키기
둘쨰는 정해진 패턴으로 한번 작동 시키기
마지막 세번째는 정해진 패턴으로 반복 작동 시키기
입니다.
모두 vibrate( ) 함수를 사용하는데 어떤 parameter 를 넘겨 주느냐에 따라
작동법이 달라 집니다.
첫번째 한번 작동은 param으로 milliseconds를 넘겨 줍니다.
vibrate(1000); // 1000이 1초 입니다.
두번째와 세번째는 정해진 패턴의 long형 milliseconds의 배열을 넘겨 줍니다.
배열의 형태는
long[] vloop = {0, 500, 100, 500, 100,….}; //500은 0.5초 입니다.
이고
배열 값의 의미는 {무진동 시간, 진동 시간, 무진동 시간, 진동 시간, ……}
배열 이므로 원하는 만큼 원하는 숫자를 기입하면 됩니다.
그리고 두번째 param에 따라 반복 여부가 결정 됩니다.
-1 이면 1회 진동, 0이상이면 반복 진동입니다.
vibrate(패턴, -1); //1회 패턴 진동
vibrate(패턴, 0이상); //패턴 반복 진동
그런데 여기서 반복 진동도 2가지 종류로 나누어 집니다.
물론 핸드폰마다 조금씩 다른데, 정상적으로(동일 패턴) 무한 반복하는 것도 있습니다.
함수 사용 |
진동 방식 |
진동 형태 |
vibrate(패턴, -1); |
패턴 1회 진동 |
패턴 시간씩 진동/ 종료 |
vibrate(패턴, 0); |
패턴 반복 진동 |
패턴 시간씩 진동/ 패턴 시간씩 진동 |
vibrate(패턴, 1); |
패턴 반복 진동 |
패턴 시간씩 진동/ 짧은 시간씩 진동 |
vibrate(패턴, 2); |
패턴 반복 진동 |
패턴 시간씩 진동/ 패턴 시간씩 진동 |
vibrate(패턴, 3); |
패턴 반복 진동 |
패턴 시간씩 진동/ 짧은 시간씩 진동 |
vibrate(패턴, 4); |
패턴 반복 진동 |
패턴 시간씩 진동/ 패턴 시간씩 진동 |
... |
... |
... |
이런 진동 형태가 반복이 되는데
0, 2, 4, … 짝수의 값은 패턴에 기입한 시간의 패턴이 무한 반복이 되지만
1, 3, 5,… 홀수 값일 경우에는 최초에만 정해진 시간 패턴으로 진동을 하고
그 다음 부터는 매우 짧게 틱, 틱, 틱 하는 정도로만 진동을 합니다.
2. 진동 테스트 프로그램
2.1 진동 사용 허가
핸드폰의 진동자를 사용하기 위해서는 사용허가를 해야 합니다.
AndroidManifest.xml에 permission을 추가 합니다.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.desk.vibrator"> <uses-permission android:name="android.permission.VIBRATE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
2.2 Layout 작성
기능이 단순해서 vibrate( ) 함수의 parameter 별로 버튼을 만들었습니다.
[1초], [패턴 1회], [패턴 반복], [종료]
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="8dp" android:text="1초" app:layout_constraintBottom_toTopOf="@+id/button2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.621" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="48dp" android:text="패턴" app:layout_constraintBottom_toTopOf="@+id/button3" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="48dp" android:text="반복" app:layout_constraintBottom_toTopOf="@+id/button4" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="96dp" android:text="종료" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </android.support.constraint.ConstraintLayout>
2.3 Main Source
Vibrator를 선언하고 버튼을 눌러 진동을 테스트 합니다.
추가로 바탕을 터치해도 진동이 되도록 했습니다.
@Override
public boolean onTouchEvent(MotionEvent event) { }
단순해서 머 더 설명할게 없습니다.
package com.example.desk.vibrator; import android.content.Context; import android.os.Vibrator; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn1 = (Button)findViewById(R.id.button); Button btn2 = (Button)findViewById(R.id.button2); Button btn3 = (Button)findViewById(R.id.button3); Button btn4 = (Button)findViewById(R.id.button4); btn1.setOnClickListener(this); btn2.setOnClickListener(this); btn3.setOnClickListener(this); btn4.setOnClickListener(this); } @Override public void onClick(View v) { Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE); long[] vloop = {0, 500, 100, 500, 100, 500, 100}; if(v.getId() == R.id.button) { vibrator.vibrate(1000); //1초 작동 } else if(v.getId() == R.id.button2) { vibrator.vibrate(vloop, -1); //패턴 1회 작동 } else if(v.getId() == R.id.button3) { vibrator.vibrate(vloop, 0); //패턴 반복 } else if(v.getId() == R.id.button4) { vibrator.cancel(); } } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); final Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE); switch(action) { case MotionEvent.ACTION_DOWN : //화면을 터치했을때 이벤트 vibrator.vibrate(new long[] {0,100}, 0); //계속 진동 break; case MotionEvent.ACTION_UP : //화면을 터치했다 땠을때 이벤트 vibrator.cancel(); //진동 취소 break; case MotionEvent.ACTION_MOVE : //화면을 터치하고 이동할때 이벤트 vibrator.vibrate(new long[] {0,100}, 0); //계속 진동 break; } return super.onTouchEvent(event); } }
3. 결과
3.1 결과 화면
버튼과 바탕화면을 클릭 또는 이동 하면서 테스트 하세요.
3.2 Source Code
3.3 APK File
- copy coding -
'Android' 카테고리의 다른 글
안드로이드 GPS를 이용한 속도 측정 (7) | 2018.11.21 |
---|---|
android GPS,Network 이용 좌표 얻기 (GPS_PROVIDER, NETWORK_PROVIDER) (4) | 2018.11.19 |
안드로이드 중력 센서 (TYPE_GRAVITY) (0) | 2018.10.13 |
안드로이드 가속도 센서 비교 (TYPE_ACCELEROMETER/TYPE_LINEAR_ACCELERATION) (2) | 2018.10.13 |
안드로이드 자기장 센서/금속 탐지기 테스트 (TYPE_MAGNETIC_FIELD) (0) | 2018.10.09 |