ฉันเขียนแอปพลิเคชัน Android ตอนนี้ฉันต้องการทำให้อุปกรณ์สั่นเมื่อมีการกระทำบางอย่างเกิดขึ้น ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันเขียนแอปพลิเคชัน Android ตอนนี้ฉันต้องการทำให้อุปกรณ์สั่นเมื่อมีการกระทำบางอย่างเกิดขึ้น ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
ลอง:
import android.os.Vibrator;
...
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Vibrate for 500 milliseconds
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
v.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
//deprecated in API 26
v.vibrate(500);
}
บันทึก:
อย่าลืมรวมสิทธิ์ในไฟล์ AndroidManifest.xml:
<uses-permission android:name="android.permission.VIBRATE"/>
vibrate(VibrationEffect)
แทน
ก่อนที่คุณจะเริ่มใช้งานโค้ดการสั่นสะเทือนใด ๆ คุณต้องให้สิทธิ์แก่แอปพลิเคชันในการสั่นของคุณ
<uses-permission android:name="android.permission.VIBRATE"/>
ตรวจสอบให้แน่ใจว่าได้รวมบรรทัดนี้ในไฟล์ AndroidManifest.xml ของคุณ
IDEs ส่วนใหญ่จะทำสิ่งนี้ให้คุณ แต่นี่คือคำสั่งการนำเข้าหากคุณไม่ได้:
import android.os.Vibrator;
ตรวจสอบให้แน่ใจว่าสิ่งนี้อยู่ในกิจกรรมที่คุณต้องการให้เกิดการสั่นสะเทือน
ในสถานการณ์ส่วนใหญ่คุณจะต้องการสั่นสะเทือนอุปกรณ์เป็นระยะเวลาสั้น ๆ ที่กำหนดไว้ล่วงหน้า คุณสามารถทำได้โดยใช้vibrate(long milliseconds)
วิธีการ นี่คือตัวอย่างรวดเร็ว:
// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Vibrate for 400 milliseconds
v.vibrate(400);
แค่นั้นแหละ!
อาจเป็นกรณีที่คุณต้องการให้อุปกรณ์สั่นต่อไปเรื่อย ๆ สำหรับสิ่งนี้เราใช้vibrate(long[] pattern, int repeat)
วิธีการ:
// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Start without a delay
// Vibrate for 100 milliseconds
// Sleep for 1000 milliseconds
long[] pattern = {0, 100, 1000};
// The '0' here means to repeat indefinitely
// '0' is actually the index at which the pattern keeps repeating from (the start)
// To repeat the pattern from any other point, you could increase the index, e.g. '1'
v.vibrate(pattern, 0);
เมื่อคุณพร้อมที่จะหยุดการสั่นสะเทือนเพียงแค่เรียกcancel()
วิธีการ:
v.cancel();
หากคุณต้องการการสั่นสะเทือนแบบ bespoke คุณสามารถลองสร้างรูปแบบการสั่นสะเทือนของคุณเองได้:
// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Start without a delay
// Each element then alternates between vibrate, sleep, vibrate, sleep...
long[] pattern = {0, 100, 1000, 300, 200, 100, 500, 200, 100};
// The '-1' here means to vibrate once, as '-1' is out of bounds in the pattern array
v.vibrate(pattern, -1);
มี SDK จำนวนมากที่เสนอข้อเสนอแนะแบบสัมผัสที่ครอบคลุมมากขึ้น หนึ่งที่ผมใช้สำหรับเทคนิคพิเศษเป็นแพลตฟอร์มการพัฒนา Haptic แช่สำหรับ Android
หากอุปกรณ์ของคุณไม่สั่นก่อนอื่นให้ตรวจสอบว่าสามารถสั่นได้:
// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Output yes if can vibrate, no otherwise
if (v.hasVibrator()) {
Log.v("Can Vibrate", "YES");
} else {
Log.v("Can Vibrate", "NO");
}
ประการที่สองโปรดตรวจสอบให้แน่ใจว่าคุณได้อนุญาตให้แอปพลิเคชันของคุณสั่น! อ้างอิงกลับไปยังจุดแรก
วิธีการสั่น (ช่วงเวลา) การอัปเดต 2017 เลิกใช้แล้วกับ Android-O (API 8.0)
เพื่อรองรับ Android ทุกรุ่นให้ใช้วิธีนี้
// Vibrate for 150 milliseconds
private void shakeItBaby() {
if (Build.VERSION.SDK_INT >= 26) {
((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(150);
}
}
Kotlin:
// Vibrate for 150 milliseconds
private fun shakeItBaby(context: Context) {
if (Build.VERSION.SDK_INT >= 26) {
(context.getSystemService(VIBRATOR_SERVICE) as Vibrator).vibrate(VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE))
} else {
(context.getSystemService(VIBRATOR_SERVICE) as Vibrator).vibrate(150)
}
}
getSystemService
ด้วยthis.getContext().getSystemService
คำตอบข้างต้นนั้นสมบูรณ์แบบ อย่างไรก็ตามฉันต้องการที่จะสั่นแอพของฉันสองครั้งเมื่อคลิกปุ่มและข้อมูลเล็ก ๆ นี้หายไปที่นี่จึงโพสต์สำหรับผู้อ่านในอนาคตเช่นฉัน :)
เราต้องปฏิบัติตามที่กล่าวไว้ข้างต้นและการเปลี่ยนแปลงเพียงอย่างเดียวจะอยู่ในรูปแบบการสั่นดังนี้
long[] pattern = {0, 100, 1000, 300};
v.vibrate(pattern, -1); //-1 is important
สิ่งนี้จะสั่นสะเทือนสองครั้งอย่างแน่นอน อย่างที่เรารู้อยู่แล้ว
หนึ่งสามารถไปและกล่าวถึงความล่าช้าและการสั่นสะเทือนหรือ (เช่น 0, 100, 1,000, 300, 1000, 300 สำหรับ 3 การสั่นสะเทือนและอื่น ๆ .. ) แต่จำไว้ว่าคำ @ เดฟใช้มันอย่างรับผิดชอบ :)
นอกจากนี้ยังทราบว่าที่นี่ทำซ้ำพารามิเตอร์การตั้งค่าเพื่อ -1 ซึ่งหมายถึงการสั่นสะเทือนที่จะเกิดขึ้นตรงตามที่กล่าวไว้ในรูปแบบ :)
ฉันพยายามทำความเข้าใจเกี่ยวกับวิธีการทำสิ่งนี้ในการติดตั้งครั้งแรกของฉัน - ตรวจสอบให้แน่ใจว่าคุณมีสิ่งต่อไปนี้:
1) อุปกรณ์ของคุณรองรับการสั่นสะเทือน (แท็บเล็ต Samsung ของฉันไม่ทำงานดังนั้นฉันจึงตรวจสอบรหัสอีกครั้ง - รหัสต้นฉบับทำงานได้อย่างสมบูรณ์บน CM Touchpad ของฉัน
2) คุณได้ประกาศเหนือระดับแอปพลิเคชันในไฟล์ AndroidManifest.xml ของคุณเพื่อให้สิทธิ์ในการเรียกใช้รหัส
3) ได้นำเข้าทั้งสองอย่างต่อไปนี้ใน MainActivity.java ของคุณด้วยการนำเข้าอื่น ๆ : import android.content.Context; นำเข้า android.os.Vibrator;
4) เรียกการสั่นสะเทือนของคุณ (พูดถึงอย่างกว้างขวางในหัวข้อนี้แล้ว) - ฉันทำมันในฟังก์ชั่นที่แยกต่างหากและเรียกสิ่งนี้ในรหัสที่จุดอื่น ๆ - ขึ้นอยู่กับสิ่งที่คุณต้องการใช้เพื่อเรียกการสั่นสะเทือนที่คุณอาจต้องการภาพ ( Android: คลิกค้างที่ปุ่ม -> ดำเนินการ ) หรือฟังปุ่มหรือวัตถุที่คลิกได้ตามที่กำหนดไว้ใน XML ( ภาพที่คลิกได้ - android ):
public void vibrate(int duration)
{
Vibrator vibs = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibs.vibrate(duration);
}
หากคุณต้องการเพียงแค่สั่นสะเทือนอุปกรณ์หนึ่งครั้งเพื่อให้ข้อเสนอแนะเกี่ยวกับการกระทำของผู้ใช้ คุณสามารถใช้ฟังก์ชั่นของperformHapticFeedback()
View
สิ่งนี้ไม่ต้องการการVIBRATE
อนุญาตที่จะประกาศในรายการ
ใช้ฟังก์ชั่นต่อไปนี้เป็นฟังก์ชั่นระดับบนสุดในบางคลาสทั่วไปเช่น Utils.kt ของโครงการของคุณ:
/**
* Vibrates the device. Used for providing feedback when the user performs an action.
*/
fun vibrate(view: View) {
view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
}
จากนั้นใช้ที่ใดก็ได้ในของคุณFragment
หรือActivity
ตาม:
vibrate(requireView())
ง่ายเหมือนที่!
<uses-permission android:name="android.permission.VIBRATE"/>
ควรเพิ่มใน<manifest>
แท็กและ<application>
แท็กภายนอก
ฉันใช้วิธี utils ต่อไปนี้:
public static final void vibratePhone(Context context, short vibrateMilliSeconds) {
Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(vibrateMilliSeconds);
}
เพิ่มสิทธิ์ต่อไปนี้ในไฟล์ AndroidManifest
<uses-permission android:name="android.permission.VIBRATE"/>
คุณสามารถใช้วิธีการโอเวอร์โหลดในกรณีที่คุณต้องการใช้การสั่นสะเทือนประเภทต่าง ๆ (รูปแบบ / ไม่ จำกัด ) ตามที่แนะนำข้างต้น
คำตอบข้างต้นนั้นถูกต้องมาก แต่ฉันกำลังทำขั้นตอนง่าย ๆ :
private static final long[] THREE_CYCLES = new long[] { 100, 1000, 1000, 1000, 1000, 1000 };
public void longVibrate(View v)
{
vibrateMulti(THREE_CYCLES);
}
private void vibrateMulti(long[] cycles) {
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification();
notification.vibrate = cycles;
notificationManager.notify(0, notification);
}
แล้วในไฟล์ xml ของคุณ:
<button android:layout_height="wrap_content"
android:layout_width ="wrap_content"
android:onclick ="longVibrate"
android:text ="VibrateThrice">
</button>
นั่นเป็นวิธีที่ง่ายที่สุดวิธี
การสั่นในรูปแบบ / คลื่น :
import android.os.Vibrator;
...
// Vibrate for 500ms, pause for 500ms, then start again
private static final long[] VIBRATE_PATTERN = { 500, 500 };
mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// API 26 and above
mVibrator.vibrate(VibrationEffect.createWaveform(VIBRATE_PATTERN, 0));
} else {
// Below API 26
mVibrator.vibrate(VIBRATE_PATTERN, 0);
}
บวก
การอนุญาตที่จำเป็นในAndroidManifest.xml
:
<uses-permission android:name="android.permission.VIBRATE"/>
ใช้เป็นฟังก์ชันระดับบนสุดในคลาสทั่วไปของโปรเจ็กต์ของคุณเช่น Utils.kt
// Vibrates the device for 100 milliseconds.
fun vibrateDevice(context: Context) {
val vibrator = getSystemService(context, Vibrator::class.java)
vibrator?.let {
if (Build.VERSION.SDK_INT >= 26) {
it.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE))
} else {
@Suppress("DEPRECATION")
it.vibrate(100)
}
}
}
แล้วเรียกมันจากที่ใดก็ได้ในรหัสของคุณดังต่อไปนี้:
vibrateDevice(requireContext())
การใช้Vibrator::class.java
มีความปลอดภัยมากกว่าการใช้String
ค่าคงที่
เราตรวจสอบvibrator
สำหรับ nullability ใช้let { }
เพราะถ้าการสั่นสะเทือนจะไม่สามารถใช้ได้สำหรับอุปกรณ์ที่จะได้รับvibrator
null
มันก็โอเคที่จะปราบปรามการคัดค้านในelse
ข้อเนื่องจากคำเตือนจาก SDK ที่ใหม่กว่า
เราไม่จำเป็นต้องขออนุญาตในขณะใช้งานจริงสำหรับการใช้การสั่นสะเทือน แต่เราจำเป็นต้องประกาศในAndroidManifest.xml
ดังต่อไปนี้:
<uses-permission android:name="android.permission.VIBRATE"/>
ใช้สิ่งนี้:
import android.os.Vibrator;
...
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Vibrate for 1000 milliseconds
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
v.vibrate(VibrationEffect.createOneShot(1000,VibrationEffect.DEFAULT_AMPLITUDE));
}else{
//deprecated in API 26
v.vibrate(1000);
}
บันทึก:
อย่าลืมรวมสิทธิ์ในไฟล์ AndroidManifest.xml:
<uses-permission android:name="android.permission.VIBRATE"/>
คุณสามารถสั่นสะเทือนอุปกรณ์และงานของมัน
Vibrator v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(100);
จำเป็นต้องได้รับอนุญาต แต่ไม่จำเป็นต้องได้รับอนุญาตในการใช้งานจริง
<uses-permission android:name="android.permission.VIBRATE"/>