بسم الله الرحمن الرحيم
في هذه الفترة, سوف نعرض عليكم مشاريع مع أكوادها مفتوحة المصدر, وشرح بعض النقاط ..
تستطيع من خلال المشاريع فهم نقاط في البرمجة, وتزيد خبرتك أكبر في برمجة تطبيقات اندرويد, كما يمكنك عمل تجميعة من التطبيقات والمميزات من خلال المشاريع المفتوحة المصدر.
اليوم إن شاء الله مشروع ناطق صوتي, مع خيارات لسرعة الصوت .. وتستطيع كذلك تغيير اللغة لعدة بلاد.
سوف أعرض عليكم الأكواد مباشرة, لأنني أتوقع من خلال متابعتك للمدونة تستطيع بعدها عمل مشروع جديد, وإن تتخطى مستوى مبتدأ في هذا المجال.
معاينة:
الأمر بسيط .. لأنها تتصل بكلاسات موجود سابقاً بلغة الجافا. وفي البداية سوف نستخدم في ملف لليوت الرئيسية التالي :
2 TextView, 1 EditText, 1 Spinner and 1 Button .
جميعها تم شرحها سابقاً, عدا عنصر سبينر (Spinner) فهو بمثابة قائمة صغيرة, تستطيع اختيار منها قيمة واحدة من مجموعة من القيم, بمثابة سؤال وله عدة خيارات يمكنك اختيار واحدة فقط لتعرض لك القيمة. يمكنك القول إنها قائمة منسدلة 🙂
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="20dp"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp"> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.8" android:ems="10" > <requestFocus /> </EditText> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:layout_weight="0.2" android:text="النص:" /> </LinearLayout> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="تحدث !" android:layout_margin="20dp" android:layout_gravity="center_horizontal" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Spinner android:id="@+id/spinner1" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_weight="0.8"/> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:layout_weight="0.2" android:text="السرعة:" /> </LinearLayout> </LinearLayout>
اما بالنسبة لملف الجافا الرئيسي .. فهو واضح وسوف أضع سطور التعليقات لبعض النقاط التي تستطيع التعديل فيها حسب ما يناسبك. أمور كثيرة لن أوضحها لأنها أصبحت واضحة بالنسبة لك من خلال دروسنا السابقة.
MainActivity.java
package com.andrody.first_app; import android.app.Activity; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.Toast; import java.util.ArrayList; import java.util.List; import java.util.Locale; public class MainActivity extends Activity implements TextToSpeech.OnInitListener,OnItemSelectedListener { private TextToSpeech tts; private Button buttonSpeak; private EditText editText; private Spinner speedSpinner,pitchSpinner; private static String speed="الافتراضي"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tts = new TextToSpeech(this, this); buttonSpeak = (Button) findViewById(R.id.button1); editText = (EditText) findViewById(R.id.editText1); speedSpinner = (Spinner) findViewById(R.id.spinner1); //تحميل البيانات من الـ سبينر loadSpinnerData(); speedSpinner.setOnItemSelectedListener(this); //الضغط على زر تحدث buttonSpeak.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { setSpeed(); speakOut(); } }); } @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { // تستطيع من هنا تغيير اللغة UK int result = tts.setLanguage(Locale.UK); if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { Log.e("TTS", "للأسف لم يتم اعتماده"); } else { buttonSpeak.setEnabled(true); speakOut(); } } else { Log.e("TTS", "Initilization فشل!");} } @Override public void onDestroy() { // ايقاف تحويل الصوت if (tts != null) { tts.stop(); tts.shutdown(); } super.onDestroy(); } // قائمة السرعة مع سرعة كلاً منها private void setSpeed(){ if(speed.equals("بطيء جداً")){ tts.setSpeechRate(0.1f); } if(speed.equals("بطيء")){ tts.setSpeechRate(0.5f); } if(speed.equals("الافتراضي")){ tts.setSpeechRate(1.0f); // السرعة الافتراضية 1.0f } if(speed.equals("سريع")){ tts.setSpeechRate(1.5f); } if(speed.equals("سريع جداً")){ tts.setSpeechRate(2.0f); } } private void speakOut() { String text = editText.getText().toString(); tts.speak(text, TextToSpeech.QUEUE_FLUSH, null); } private void loadSpinnerData() { //البيانات داخل عنصر سرعة سبينر List<String> lables = new ArrayList<String>(); lables.add("بطيء جداً"); lables.add("بطيء"); lables.add("الافتراضي"); lables.add("سريع"); lables.add("سريع جداً"); // إنشاء محول لـ سبينر ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, lables); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // ربط محول adapter بـ سبينر speedSpinner.setAdapter(dataAdapter); } @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // بعد اختيار عنصر من قائمة سبينر.. توست speed = parent.getItemAtPosition(position).toString(); Toast.makeText(parent.getContext(), "القد اخترت:" + speed, Toast.LENGTH_LONG).show(); } @Override public void onNothingSelected(AdapterView<?> arg0) { } }
في حال تغيير اللغة , هناك عدة لغات معدودة معتمدة .. تستطيع معرفتها من الموقع الرسمي للمطورين :
http://developer.android.com/reference/java/util/Locale.html
عدل بالكود كما يحلو لك .. وأعرضه على المحاكي, لترى نتيجة عملك ..
انتظرونا بكل جديد ومفيد .. والسلام عليكم 🙂
لتحميل التدوينة في كتاب إلكتروني Download pdf : https://andrody.com/?attachment_id=195
تسلم يا غالي ولكم جزيل الشكر ……. إستفدنا الكثير