ساخت APK رایگان

API پل جاوااسکریپت

لرزش و صدا

بازخورد لمسی، صدای کلیک خودِ اپلیکیشن که روی رویدادهای معنادار شما فعال می‌شود نه هر ضربهٔ پراکنده، و آهنگ موسیقی پس‌زمینه‌ای که سازنده هنگام ساخت انتخاب کرده - getMusicVolume وقتی اپلیکیشن چیزی نداشته باشد -1 برمی‌گرداند، پس صفحهٔ تنظیمات می‌تواند به‌جای نشان دادن اسلایدر بی‌اثر، آن را پنهان کند.

navigator.vibrate استاندارد وب#

navigator.vibrate(pattern)

نمونه

گوشی را با Vibration API استاندارد وب می‌لرزاند. navigator.vibrate خودِ Android WebView هرگز موتور را حرکت نمی‌دهد؛ اپلیکیشن آن را در شروع سند جایگزین می‌کند تا واقعاً بلرزد.

مقدار بازگشتی: true وقتی درخواست پذیرفته شد، false برای ورودی نامعتبر (مدت منفی یا غیرعدد). پیش‌نیاز: هنگام ساخت در مرحله ۴ (دسترسی) Vibrate را روشن کنید. اپلیکیشن‌های ساخته‌شده با هوش مصنوعی وقتی کد می‌لرزاند آن را خودکار روشن دریافت می‌کنند.

function buzz(pattern) {
  if ('vibrate' in navigator) navigator.vibrate(pattern);
}

document.getElementById('save').addEventListener('click', function () {
  buzz(30);                    // one short buzz, 30 ms
});

document.getElementById('wrong').addEventListener('click', function () {
  buzz([80, 40, 80]);          // buzz 80, pause 40, buzz 80
});

document.getElementById('alarm-off').addEventListener('click', function () {
  buzz(0);                     // 0 or [] stops a running vibration
});

از مقدار برگشتی برای تشخیص مدت نامعتبر استفاده کنید، مثلاً مدتی که کاربر تایپ کرده است:

document.getElementById('test-buzz').addEventListener('click', function () {
  var ms = parseInt(document.getElementById('buzz-ms').value, 10);   // '' gives NaN
  if (!('vibrate' in navigator)) return;
  if (!navigator.vibrate(ms)) {
    showError('Enter a duration of 0 ms or more.');
  }
});

یک تیک کوتاه وقتی کشیدن برای تازه‌سازی از نقطه‌ای می‌گذرد که با رها کردن، صفحه تازه‌سازی می‌شود:

var armed = false;
var list = document.getElementById('feed');

list.addEventListener('touchmove', function () {
  var ready = list.scrollTop <= 0 && pullDistance() > 80;
  if (ready && !armed && 'vibrate' in navigator) navigator.vibrate(15);
  armed = ready;
}, { passive: true });

list.addEventListener('touchend', function () {
  if (armed) refreshFeed();
  armed = false;
});

نکته‌ها:

  • الگو همان الگوی وب است: عدد اول یک لرزش است، سپس مکث، لرزش، مکث ... (اپلیکیشن آن را برای اندروید تبدیل می‌کند).
  • اگر Vibrate هنگام ساخت روشن نشده بود، فراخوانی همچنان true برمی‌گرداند اما گوشی نمی‌لرزد.
  • اعداد اعشاری به پایین گرد می‌شوند. در آرایه، اعداد منفی صفر حساب می‌شوند.
  • در مرورگر دسکتاپ ممکن است navigator.vibrate وجود نداشته باشد، پس بررسی 'vibrate' in navigator را نگه دارید.

cancelVibrate پل#

window.WebToApk.cancelVibrate()

لرزش‌های ساده برای صفحه (navigator.vibrate و شکل الگو). هر دو نادیده گرفته می‌شوند مگر اینکه ساخت، مجوز لرزش را فعال کرده باشد.

با گروه خودش، لرزش، توضیح داده شده است، نه به‌تنهایی.

نمونه

لرزشی را که هنوز در حال اجراست متوقف می‌کند. بیشتر صفحه‌ها از navigator.vibrate(0) استاندارد استفاده می‌کنند که این را برای شما صدا می‌زند.

خروجی: هیچ. نیازمندی: هنگام ساخت، لرزش را در مرحله ۴ (دسترسی) روشن کنید.

روش استاندارد:

if ('vibrate' in navigator) navigator.vibrate(0);   // or navigator.vibrate([])

فراخوانی خام، مثلاً برای متوقف کردن یک الگوی آلارم طولانی وقتی کاربر «رد کردن» را می‌زند:

if (window.WebToApk && window.WebToApk.vibratePattern) {
  window.WebToApk.vibratePattern(JSON.stringify([1000, 500, 1000, 500, 1000]));
}

document.getElementById('dismiss').addEventListener('click', function () {
  if (window.WebToApk && typeof window.WebToApk.cancelVibrate === 'function') {
    window.WebToApk.cancelVibrate();
  }
});

وقتی کاربر از صفحه خارج می‌شود، لرزش در حال اجرا را متوقف کنید تا گوشی در جیب او لرزیدن را ادامه ندهد:

document.addEventListener('visibilitychange', function () {
  if (!document.hidden) return;
  if (window.WebToApk && typeof window.WebToApk.cancelVibrate === 'function') {
    window.WebToApk.cancelVibrate();
  }
});

نکته‌ها: فراخوانی آن وقتی چیزی در حال لرزش نیست بی‌خطر است.

getMusicVolume پل#

window.WebToApk.getMusicVolume(): Int

سطح فعلی از ۰ تا ۱۰۰، یا ۱- وقتی این اپلیکیشن موسیقی پس‌زمینه ندارد.

نمونه

سطح موسیقی پس‌زمینهٔ حلقه‌ای اپلیکیشن را از 0 تا 100 می‌خواند.

مقدار بازگشتی: یک عدد، همگام: 0-100، یا -1 وقتی این اپلیکیشن بدون فایل موسیقی ساخته شده. پیش‌نیاز: فایلی که در مرحله ۳ (Integrate) زیر Background Music، زیر Display Options هنگام ساخت انتخاب شده.

فقط وقتی موسیقی وجود دارد، نوار لغزنده موسیقی را نشان دهید:

var slider = document.getElementById('music-slider');
var level = -1;
if (window.WebToApk && typeof window.WebToApk.getMusicVolume === 'function') {
  level = window.WebToApk.getMusicVolume();
}

if (level < 0) {
  slider.parentNode.hidden = true;          // no music in this app: hide the setting
} else {
  slider.value = level;
  slider.addEventListener('input', function () {
    window.WebToApk.setMusicVolume(parseInt(slider.value, 10));
  });
}

دکمهٔ بی‌صدا که هنگام لغو بی‌صدایی به سطح خودِ کاربر برمی‌گردد (اپلیکیشن 0 را هم به خاطر می‌سپارد، پس سطح قدیمی را خودتان نگه دارید):

function musicLevel() {
  return window.WebToApk && typeof window.WebToApk.getMusicVolume === 'function'
    ? window.WebToApk.getMusicVolume() : -1;
}
var muteBtn = document.getElementById('mute');

function paint() {
  var v = musicLevel();
  muteBtn.hidden = v < 0;
  muteBtn.textContent = v === 0 ? 'Unmute' : 'Mute';
}

muteBtn.addEventListener('click', function () {
  var v = musicLevel();
  if (v < 0) return;
  if (v > 0) {
    try { localStorage.setItem('musicBefore', String(v)); } catch (e) {}
    window.WebToApk.setMusicVolume(0);
  } else {
    var back = 40;
    try { back = parseInt(localStorage.getItem('musicBefore') || '40', 10); } catch (e) {}
    window.WebToApk.setMusicVolume(back);
  }
  paint();
});
paint();

موسیقی را از سطح فعلی به سطح جدید محو کنید، مثلاً زیر یک صحنهٔ گفت‌وگو:

function fadeMusicTo(target, ms) {
  if (!window.WebToApk || typeof window.WebToApk.getMusicVolume !== 'function') return;
  var start = window.WebToApk.getMusicVolume();
  if (start < 0 || start === target) return;
  var steps = 10, i = 0;
  var t = setInterval(function () {
    i++;
    window.WebToApk.setMusicVolume(Math.round(start + (target - start) * i / steps));
    if (i === steps) clearInterval(t);
  }, ms / steps);
}

fadeMusicTo(10, 800);     // dim under the dialogue
// later: fadeMusicTo(60, 800);  the last level set is the one kept for the next launch

نکته‌ها: سطحی را برمی‌گرداند که با نوار لغزنده ساخت یا با آخرین فراخوانی setMusicVolume شما تنظیم شده است. وقتی اپلیکیشن دیگری یا یک تماس صدا را می‌گیرد، موسیقی خودش کم می‌شود یا متوقف می‌شود؛ عددی که می‌خوانید تغییر نمی‌کند.

getVolume پل#

window.WebToApk.getVolume(stream: String): String

سطح یک جریان صدا: `{stream, current, max, percent, muted}` به‌صورت رشته JSON. stream: 'media' | 'alarm' | 'ring' | 'notification' | 'call'.

نمونه

یکی از سطوح صدای خود گوشی را می‌خواند.

مقدار بازگشتی: یک رشتهٔ JSON، همگام: {"stream":"alarm","current":5,"max":7,"percent":71,"muted":false} - current/max گام‌های خودِ گوشی‌اند (بین گوشی‌ها فرق دارند)، percent بین 0-100 است. stream یکی از 'media'، 'alarm'، 'ring'، 'notification' یا 'call' است؛ هر نام دیگری {"error":"unknown_stream"} می‌دهد. پیش‌نیاز: هیچ.

function warnIfAlarmSilent() {
  if (!(window.WebToApk && window.WebToApk.getVolume)) return;
  const v = JSON.parse(WebToApk.getVolume('alarm'));
  if (!v.error && v.percent === 0) {
    showMessage('Your alarm volume is off, so the alarm will not be heard.');
  }
}
warnIfAlarmSilent();

همه سطوح را در صفحه تنظیمات نشان دهید:

['media', 'alarm', 'ring', 'notification'].forEach(function (s) {
  const v = JSON.parse(WebToApk.getVolume(s));
  document.getElementById('vol-' + s).value = v.percent;
});

یک صدا تنظیم کنید و نتیجه را بخوانید. setVolume(stream, percent, showUi) با یک رشتهٔ JSON پاسخ می‌دهد.

function setAlarmVolume(percent) {
  if (!(window.WebToApk && WebToApk.setVolume)) return;
  const r = JSON.parse(WebToApk.setVolume('alarm', percent, true));
  if (!r.ok) showMessage('Could not change the volume: ' + r.error);   // fixed_volume, muted, ...
  else document.getElementById('vol-alarm').value = r.percent;
}

playClick پل#

window.WebToApk.playClick()

صدای لمس اپلیکیشن را در صورت نیاز پخش می‌کند، تا صفحه بتواند آن را روی رویدادهای معنایی خودش (فشار یک دکمه) فعال کند، نه روی هر لمس اتفاقی - که کاری است که یک اپلیکیشن بومی واقعاً می‌کند و دلیل اینکه clickSoundMode می‌تواند «off» باشد و این همچنان کار کند. فقط وقتی کاری نمی‌کند که اپلیکیشن بدون صدای لمس ساخته شده باشد (enableClickSound خاموش). در clickSoundMode «off» - بدون صدای خودکار روی هر لمس - فراخوانی صریح همچنان پخش می‌شود: این حالت برای اپلیکیشن‌هایی است که روی رویدادهای خودشان صدا می‌دهند. در غیر این صورت بازخورد تنظیم‌شده توسط سازنده را پخش می‌کند.

نمونه

صدای لمس اپلیکیشن را یک بار پخش می‌کند تا دکمه‌های خودتان مثل یک اپلیکیشن بومی کلیک کنند.

مقدار بازگشتی: هیچ. پیش‌نیاز: کلید Tap Sound در مرحله ۳ (Integrate)، زیر Display Options، هنگام ساخت (به‌طور پیش‌فرض روشن). با خاموش بودن کلید، این کاری نمی‌کند.

function clickSound() {
  if (window.WebToApk && typeof window.WebToApk.playClick === 'function') {
    window.WebToApk.playClick();
  }
}

document.querySelectorAll('button, .tab').forEach(function (el) {
  el.addEventListener('click', clickSound);
});

یک شنونده برای کل صفحهٔ بازی، که فقط برای ضربه‌ای که کاری انجام می‌دهد کلیک می‌کند:

document.getElementById('board').addEventListener('click', function (e) {
  var cell = e.target.closest('.cell');
  if (!cell || cell.classList.contains('taken')) return;   // a dead tap stays silent
  if (window.WebToApk && typeof window.WebToApk.playClick === 'function') {
    window.WebToApk.playClick();
  }
  placeMark(cell);
});

علاوه بر تنظیم ساخت، به کاربرانتان کلید «صداها»ی خودشان را بدهید:

var toggle = document.getElementById('sounds-toggle');
var soundsOn = true;
try { soundsOn = localStorage.getItem('sounds') !== 'off'; } catch (e) {}
toggle.checked = soundsOn;

toggle.addEventListener('change', function () {
  soundsOn = toggle.checked;
  try { localStorage.setItem('sounds', soundsOn ? 'on' : 'off'); } catch (e) {}
});

function tapSound() {
  if (soundsOn && window.WebToApk && typeof window.WebToApk.playClick === 'function') {
    window.WebToApk.playClick();
  }
}

نکته‌ها: آنچه می‌شنوید به انتخاب صدای لمس بستگی دارد:

  • پیروی از تنظیم گوشی (پیشنهادی): صدای کلیک سیستم. اگر کاربر «صدای لمس» را در تنظیمات گوشی خاموش کرده باشد، بی‌صدا است. این عمدی است.
  • همیشه با هر ضربه پخش کن: صدای کلیک خودِ اپلیکیشن، همیشه شنیدنی. هر ضربه روی صفحه هم کلیک می‌کند، پس در این حالت معمولاً به playClick() نیاز ندارید.

آن را از فشار واقعی یک دکمه فراخوانی کنید، نه از یک تایمر.

requestDndAccess پل#

window.WebToApk.requestDndAccess(): String

دسترسی Do Not Disturb، لازم برای تغییر سطح زنگ / اعلان وقتی DND روشن است. "granted" | "opened" (صفحهٔ تنظیمات باز شد) | "not_declared".

نمونه

دسترسی «مزاحم نشوید» را درخواست می‌کند؛ اندروید پیش از آنکه اجازه دهد اپلیکیشن هنگام فعال بودن «مزاحم نشوید» صدای زنگ یا اعلان را تغییر دهد، این دسترسی را لازم دارد (setVolume در آن حالت dnd_access_required را برمی‌گرداند).

مقدار بازگشتی: یک رشته: 'granted' (از قبل مجاز است)، 'opened' (صفحهٔ سیستمی که کاربر در آن اجازه می‌دهد باز شد - وقتی برگشت دوباره بررسی کنید)، یا 'not_declared' (این ساخت مجوز را ندارد، پس Android اپلیکیشن را آنجا فهرست نمی‌کند). پیش‌نیاز: صدا زدن requestDndAccess در کد اپلیکیشن شما: ساخت آن‌گاه ACCESS_NOTIFICATION_POLICY را به‌صورت خودکار اعلام می‌کند.

function allowRingVolume() {
  if (!(window.WebToApk && window.WebToApk.requestDndAccess)) return;
  const r = WebToApk.requestDndAccess();
  if (r === 'opened') showMessage('Allow Do Not Disturb access for this app, then come back.');
  if (r === 'not_declared') showMessage('Turn off Do Not Disturb to change the ring volume.');
}

تغییر صدا را وقتی کاربر دسترسی را داد یک بار دیگر تلاش کنید:

function setRing(percent) {
  const r = JSON.parse(WebToApk.setVolume('ring', percent, true));
  if (r.ok || r.error !== 'dnd_access_required') return r;
  const a = WebToApk.requestDndAccess();     // 'granted' | 'opened' | 'not_declared'
  if (a === 'granted') return JSON.parse(WebToApk.setVolume('ring', percent, true));
  showMessage(a === 'opened' ? 'Allow access, then press the button again.' : 'Turn off Do Not Disturb first.');
  return r;
}

زنگ را با کلید «حالت جلسه» بی‌صدا کنید و وقتی کار نمی‌کند دلیلش را بگویید:

function meetingMode(on) {
  if (!(window.WebToApk && WebToApk.setVolume)) return;
  const r = JSON.parse(WebToApk.setVolume('ring', on ? 0 : 70, false));
  if (!r.ok && r.error === 'dnd_access_required') {
    const a = WebToApk.requestDndAccess();
    if (a === 'not_declared') showMessage('This build cannot change the ring volume while Do Not Disturb is on.');
  }
}

setMusicVolume پل#

window.WebToApk.setMusicVolume(percent: Int)

سطح موسیقی پس‌زمینه را از صفحه تنظیم می‌کند، از ۰ تا ۱۰۰. نوار لغزنده ویزارد تعیین می‌کند اپلیکیشن چگونه شروع شود؛ این روشی است که اپلیکیشن به کاربران خودش کنترل موسیقی می‌دهد، چیزی که هر بازی دارای صفحه تنظیمات انتظار دارد داشته باشد. در [BackgroundMusic.setVolume] محدود می‌شود، پس صفحه‌ای که ۵۰۰ یا ۱- بدهد نمی‌تواند به MediaPlayer مقداری خارج از بازه پذیرفته‌شده بدهد. سطح به خاطر سپرده می‌شود: اجرای بعدی از همین سطح شروع می‌شود، نه از سطح ویزارد. اگر اپلیکیشن بدون آهنگ ساخته شده باشد، کاری انجام نمی‌دهد - چیزی برای تنظیم نیست و پاسخ درست این است که [getMusicVolume] مقدار ۱- برگرداند تا صفحه بتواند نوار لغزنده‌اش را پنهان کند، نه اینکه نواری نشان دهد که کاری نمی‌کند.

نمونه

سطح صدای موسیقی پس‌زمینه تکرارشونده اپلیکیشن را از ۰ تا ۱۰۰ تغییر می‌دهد، مثلاً از صفحه تنظیمات بازی شما.

خروجی: هیچ. نیازمندی: فایلی که هنگام ساخت در مرحله ۳ (یکپارچه‌سازی)، زیر گزینه‌های نمایش، در بخش موسیقی پس‌زمینه انتخاب شده باشد. بدون موسیقی این کار هیچ کاری نمی‌کند (برای بررسی، getMusicVolume() را ببینید) -1).

دکمهٔ بی‌صدا - اپلیکیشن سطح را برای اجرای بعدی به خاطر می‌سپارد:

function hasMusic() {
  return !!(window.WebToApk && window.WebToApk.getMusicVolume) && window.WebToApk.getMusicVolume() >= 0;
}

if (!hasMusic()) document.getElementById('mute').hidden = true;

document.getElementById('mute').addEventListener('click', function () {
  if (!hasMusic()) return;
  // clamped to 0..100 by the app, and kept for the next launch
  window.WebToApk.setMusicVolume(window.WebToApk.getMusicVolume() > 0 ? 0 : 40);
});

دکمه‌های خاموش / کم / زیاد در صفحه تنظیمات:

var LEVELS = { off: 0, low: 25, high: 70 };

document.querySelectorAll('[data-music]').forEach(function (btn) {
  btn.addEventListener('click', function () {
    if (!window.WebToApk || typeof window.WebToApk.setMusicVolume !== 'function') return;
    if (window.WebToApk.getMusicVolume() < 0) return;       // built without music
    window.WebToApk.setMusicVolume(LEVELS[btn.dataset.music]);
    markSelected(btn);
  });
});

هنگام پخش ویدیوی خودتان صدای موسیقی را کم کنید، سپس برگردانید (سطح به خاطر سپرده می‌شود، پس همیشه آن را بازگردانی کنید):

var video = document.getElementById('intro-video');
var before = -1;

video.addEventListener('play', function () {
  if (!window.WebToApk || typeof window.WebToApk.getMusicVolume !== 'function') return;
  before = window.WebToApk.getMusicVolume();
  if (before > 0) window.WebToApk.setMusicVolume(Math.round(before / 4));
});

function restoreMusic() {
  if (before > 0) window.WebToApk.setMusicVolume(before);
  before = -1;
}
video.addEventListener('pause', restoreMusic);
video.addEventListener('ended', restoreMusic);

نکته‌ها: سطحی که تنظیم می‌کنید ذخیره می‌شود: اجرای بعدی به‌جای سطح نوار لغزنده ساخت، از همین سطح شروع می‌شود (تا وقتی کاربر داده‌های اپلیکیشن را پاک کند). 0 موسیقی را بی‌صدا می‌کند اما پخش ادامه دارد.

setVolume پل#

window.WebToApk.setVolume(stream: String, percent: Double, showUi: Boolean): String

یک جریان را روی [percent] (0-100) تنظیم می‌کند؛ [showUi] اسلایدر صدای گوشی را نشان می‌دهد. `{ok:true, stream, current, max, percent}` یا `{ok:false, error}` - error یکی از unknown_stream | bad_percent | fixed_volume | dnd_access_required | muted | not_applied | failed | foreign_origin (صفحه‌ای خارج از سایت خودِ اپلیکیشن) است.

نمونه

یکی از سطح‌های صدای خودِ گوشی را روی 0-100 تنظیم می‌کند - مثلاً بلند کردن جریان آلارم برای یک آلارم بیدارباش، یا اسلایدر رسانه در یک اپلیکیشن موسیقی.

خروجی: یک رشته JSON: {"ok":true,"stream":"alarm","current":6,"max":7,"percent":86}، یا {"ok":false,"error":"…"} که در آن error یکی از این‌هاست: unknown_stream، bad_percent، fixed_volume (این دستگاه صدای قابل تنظیم ندارد)، dnd_access_required («مزاحم نشوید» روشن است و سطح زنگ / اعلان را مسدود می‌کند - requestDndAccess() را ببینید)، foreign_origin (صفحه‌ای خارج از سایت خود اپلیکیشن شما) یا failed. showUi: true نوار صدای خود گوشی را هنگام حرکت نشان می‌دهد. نیازمندی: برای رسانه، آلارم و تماس به چیزی نیاز نیست؛ زنگ و اعلان ممکن است هنگام روشن بودن «مزاحم نشوید» به دسترسی «مزاحم نشوید» نیاز داشته باشند.

function setAlarmLoud() {
  if (!(window.WebToApk && window.WebToApk.setVolume)) return;
  const r = JSON.parse(WebToApk.setVolume('alarm', 80, true));
  if (!r.ok) showMessage('Could not change the alarm volume: ' + r.error);
}

document.getElementById('ring-slider').oninput = function (e) {
  const r = JSON.parse(WebToApk.setVolume('ring', Number(e.target.value), false));
  if (r.error === 'dnd_access_required' && WebToApk.requestDndAccess() === 'not_declared') {
    showMessage('Turn off Do Not Disturb to change the ring volume.');
  }
};

یک سطح را بخوانید، سپس یک اسلایدر رسانه تنظیم کنید:

if (window.WebToApk && WebToApk.setVolume) {
  const now = JSON.parse(WebToApk.getVolume('media'));   // {stream, current, max, percent, muted}
  slider.value = now.percent;
  slider.oninput = () => {
    const r = JSON.parse(WebToApk.setVolume('media', Number(slider.value), false));
    if (r.ok) label.textContent = r.percent + '%';
    else if (r.error === 'fixed_volume') slider.disabled = true;   // this phone has no adjustable volume
  };
}

سطح فعلی زنگ را نشان دهید و هنگام تغییر آن واکنش نشان دهید:

if (window.WebToApk && WebToApk.getVolume) {
  const ring = JSON.parse(WebToApk.getVolume('ring'));   // {stream, current, max, percent, muted}
  document.getElementById('ring-slider').value = ring.percent;
  WebToApk.watchVolume(true);
  window.addEventListener('appmint:volume', (e) => {
    if (e.detail.stream === 'ring') document.getElementById('ring-slider').value = e.detail.percent;
  });
}

نکته‌ها: مقدار به نزدیک‌ترین گام گوشی گرد می‌شود و پاسخ سطحی را که واقعاً تنظیم شده می‌آورد. جریان تماس هرگز زیر حداقلش (معمولاً 1) نمی‌رود.

vibrate پل#

window.WebToApk.vibrate(durationMs: Long)

لرزش‌های ساده برای صفحه (navigator.vibrate و شکل الگو). هر دو نادیده گرفته می‌شوند مگر اینکه ساخت، مجوز لرزش را فعال کرده باشد.

با گروه خودش، لرزش، توضیح داده شده است، نه به‌تنهایی.

نمونه

گوشی را یک بار به‌اندازه تعداد میلی‌ثانیه داده‌شده می‌لرزاند. بیشتر صفحه‌ها از navigator.vibrate(ms) استاندارد استفاده می‌کنند که این را برای شما فراخوانی می‌کند.

خروجی: هیچ. نیازمندی: هنگام ساخت، لرزش را در مرحله ۴ (دسترسی) روشن کنید. بدون آن، فراخوانی کاری نمی‌کند.

روش استاندارد (در مرورگر هم همین‌طور کار می‌کند):

if ('vibrate' in navigator) navigator.vibrate(50);

فراخوانی خام:

document.getElementById('like').addEventListener('click', function () {
  if (window.WebToApk && typeof window.WebToApk.vibrate === 'function') {
    window.WebToApk.vibrate(40);      // 40 ms
  }
});

// 0 (or any value <= 0) stops a running vibration
if (window.WebToApk && window.WebToApk.vibrate) window.WebToApk.vibrate(0);

هر بار که یک اسلایدر روی گام جدیدی می‌نشیند یک تیک کوچک، مثل یک انتخابگر بومی:

var slider = document.getElementById('size');
var last = slider.value;
slider.addEventListener('input', function () {
  if (slider.value === last) return;          // same step, no tick
  last = slider.value;
  if (window.WebToApk && typeof window.WebToApk.vibrate === 'function') {
    window.WebToApk.vibrate(10);              // 10 ms: a light tick
  }
});

یک لرزش طولانی‌تر وقتی فرمی قابل ارسال نیست، تا کاربر خطا را حس کند:

document.getElementById('signup').addEventListener('submit', function (e) {
  if (this.checkValidity()) return;
  e.preventDefault();
  if (window.WebToApk && typeof window.WebToApk.vibrate === 'function') {
    window.WebToApk.vibrate(250);
  }
  this.reportValidity();
});

نکته‌ها: یک عدد صحیح بدهید. شدت همان پیش‌فرض گوشی است؛ برای ضربه‌های قوی‌تر/ضعیف‌تر از Capacitor.Plugins.Haptics.impact یا Capacitor.Plugins.AppwrightHaptics.play استفاده کنید. برای الگوی لرزش-مکث-لرزش از vibratePattern.

vibratePattern پل#

window.WebToApk.vibratePattern(patternJson: String)

یک الگوی روشن/خاموش را می‌لرزاند، مثلاً "[100,50,100]" = 100 میلی‌ثانیه لرزش، 50 مکث، 100 لرزش. پشت navigator.vibrate(array) است؛ API استاندارد را ترجیح دهید. بی‌اثر است مگر سازنده مجوز Vibrate را روشن کرده باشد.

نمونه

یک الگوی روشن/خاموش را که به‌صورت رشته JSON داده شده می‌لرزاند. بیشتر صفحه‌ها از navigator.vibrate([...]) استاندارد استفاده می‌کنند که این را برای شما فراخوانی می‌کند.

خروجی: هیچ. نیازمندی: هنگام ساخت، لرزش را در مرحله ۴ (دسترسی) روشن کنید. بدون آن، فراخوانی کاری نمی‌کند.

روش استاندارد:

if ('vibrate' in navigator) navigator.vibrate([100, 50, 100]);   // buzz, pause, buzz

فراخوانی خام همان الگوی سبک وب را به‌صورت رشتهٔ JSON می‌گیرد:

function pattern(list) {
  if (window.WebToApk && typeof window.WebToApk.vibratePattern === 'function') {
    window.WebToApk.vibratePattern(JSON.stringify(list));
  }
}

pattern([200]);                     // one 200 ms buzz
pattern([100, 50, 100, 50, 300]);   // short, short, long
pattern([]);                        // empty list stops a running vibration

الگو یک بار پخش می‌شود، پس یک آلارم خودش آن را تکرار می‌کند تا کاربر متوقفش کند:

var alarm = null;
var ALARM = JSON.stringify([500, 300, 500, 300, 500]);   // about 2.1 s

function startAlarm() {
  if (!window.WebToApk || typeof window.WebToApk.vibratePattern !== 'function') return;
  window.WebToApk.vibratePattern(ALARM);
  alarm = setInterval(function () { window.WebToApk.vibratePattern(ALARM); }, 3000);
}

function stopAlarm() {
  if (alarm === null) return;
  clearInterval(alarm);
  alarm = null;
  window.WebToApk.vibratePattern('[]');                 // stop the buzz that is still running
}

نکته‌ها: عدد اول یک لرزش است، سپس مکث، لرزش، مکث ... (ترتیب وب). اپلیکیشن «انتظار» ابتدایی اندروید را خودش اضافه می‌کند، پس خودتان 0 را اول نگذارید: [0, 100] یعنی «۰ میلی‌ثانیه لرزش، ۱۰۰ میلی‌ثانیه مکث» و چیزی حس نمی‌کنید. اعداد منفی صفر حساب می‌شوند. الگو یک بار پخش می‌شود.

watchVolume پل#

window.WebToApk.watchVolume(on: Boolean): Boolean

رویدادهای `appmint:volume` را روشن (true) یا خاموش (false) می‌کند.

نمونه

رویدادهای زندهٔ تغییر صدا را روشن یا خاموش می‌کند: وقتی روشن است، هر تغییر در سطح صدا (کلیدهای سخت‌افزاری، اسلایدر سیستم، اپلیکیشن دیگر) به‌صورت appmint:volume.

مقدار بازگشتی: true وقتی تغییر اعمال شد. پیش‌نیاز: هیچ.

if (window.WebToApk && window.WebToApk.watchVolume) {
  window.addEventListener('appmint:volume', function (e) {
    // e.detail = { stream: 'media', current: 9, max: 15, percent: 60, muted: false }
    document.getElementById('vol-' + e.detail.stream).value = e.detail.percent;
  });
  WebToApk.watchVolume(true);
  window.addEventListener('pagehide', function () { WebToApk.watchVolume(false); });
}

همین شیء به یک قلاب صفحه هم می‌رسد، اگر ترجیح می‌دهید:

window.onAppMintVolume = function (level) {
  if (level.stream === 'alarm' && level.percent === 0) showMessage('Alarm volume is now off.');
};
WebToApk.watchVolume(true);

سطح را یک‌بار با getVolume نشان دهید، سپس فقط وقتی صفحه دیده می‌شود زنده نگهش دارید:

if (window.WebToApk && WebToApk.watchVolume && WebToApk.getVolume) {
  const meter = document.getElementById('media-meter');
  meter.value = JSON.parse(WebToApk.getVolume('media')).percent;
  const onVol = function (e) { if (e.detail.stream === 'media') meter.value = e.detail.percent; };
  document.addEventListener('visibilitychange', function () {
    if (document.hidden) { WebToApk.watchVolume(false); window.removeEventListener('appmint:volume', onVol); }
    else { window.addEventListener('appmint:volume', onVol); WebToApk.watchVolume(true); }
  });
}

نکته‌ها: برای هر جریان صدایی که تغییر کرده یک رویداد (media، alarm، ring، notification، call). وقتی صفحه‌ای که سطوح را نشان می‌دهد بسته شد، آن را خاموش کنید.