Воскресенье, 18.11.2018, 13:15
Поиск
Никнэйм
Сертификат на никнейм Olelucoye, зарегистрирован на Тимофеев Константин Михайлович
Зарегистрируй свой никнейм
Обратная связь
olelucoye.tk@yandex.ru
Реклама AdSense
Реклама
Друзья сайта
  • Лига медицинского права
  • Гостиница "Зай"
  • FAQ по системе
  • Инструкции для uCoz
  • Главная » Статьи » Андроид разработка

    Создание виджета - электронные часы с кастомным шрифтом (Листинги)

    string.xml

    <resources>

        <string name="app_name">DigitClock</string>

        <string name="label_widget">DigitClock</string>

        <string name="Jan">Января</string>

        <string name="Feb">Февраля</string>

        <string name="Mar">Марта</string>

        <string name="Apr">Апреля</string>

        <string name="May">Мая</string>

        <string name="Jun">Июня</string>

        <string name="Jul">Июля</string>

        <string name="Aug">Августа</string>

        <string name="Sep">Сентября</string>

        <string name="Okt">Октября</string>

        <string name="Nov">Ноября</string>

        <string name="Dec">Декабря</string>

        <string name="Text_color">Цвет текста</string>

        <string name="Backgr">Фон</string>

    </resources>

    color.xml.

    <?xml version="1.0" encoding="utf-8"?>

    <resources>

        <color name="red">#FF0000</color>

        <color name="green">#00FF00</color>

        <color name="blue">#0000FF</color>

    </resources>

    config_digitclock.xml

    <?xml version="1.0" encoding="utf-8"?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:orientation="vertical" >

        <TextView

            android:id="@+id/textView1"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:gravity="center_horizontal"

            android:text="@string/Text_color" />

        <RadioGroup

            android:id="@+id/rgColor"

            android:layout_width="match_parent"

            android:layout_height="wrap_content" >

            <RadioButton

                android:id="@+id/radioRed"

                android:layout_width="match_parent"

                android:layout_height="wrap_content"

                android:background="@color/red"

                android:checked="true"/>

            <RadioButton

                android:id="@+id/radioGreen"

                android:layout_width="match_parent"

                android:layout_height="wrap_content"

                android:background="@color/green"

                />

            <RadioButton

                android:id="@+id/radioBlue"

                android:layout_width="match_parent"

                android:layout_height="wrap_content"

                android:background="@color/blue"/>

        </RadioGroup>

        <TextView

            android:id="@+id/textView2"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:gravity="center_horizontal"

            android:text="@string/Backgr" />

        <RadioGroup

            android:id="@+id/rgBack"

            android:layout_width="match_parent"

            android:layout_height="wrap_content" >

            <RadioButton

                android:id="@+id/radioBack1"

                android:layout_width="match_parent"

                android:layout_height="wrap_content"

                android:background="@drawable/fon1_1"

                android:checked="true"/>

            <RadioButton

                android:id="@+id/radioBack2"

                android:layout_width="match_parent"

                android:layout_height="wrap_content"

                android:background="@drawable/fon2_1"/>

        </RadioGroup>

        <Button

            android:id="@+id/btApply"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:text="OK"

            android:onClick="onApply" />

    </LinearLayout>

     

    ConfigActivity.java

    package ru.urok.digitclock;

    import android.app.Activity;

    import android.appwidget.AppWidgetManager;

    import android.content.Intent;

    import android.content.SharedPreferences;

    import android.content.SharedPreferences.Editor;

    import android.graphics.Color;

    import android.os.Bundle;

    import android.view.View;

    import android.view.Window;

    import android.widget.RadioGroup;

     

    public class ConfigActivity extends Activity {

           int widgetID = AppWidgetManager.INVALID_APPWIDGET_ID;

           Intent resultValue;

          

           @Override

             protected void onCreate(Bundle savedInstanceState) {

               super.onCreate(savedInstanceState);

               requestWindowFeature(Window.FEATURE_NO_TITLE);

               Intent intent = getIntent();

               Bundle extras = intent.getExtras();

               if (extras != null) {

                 widgetID = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,

                     AppWidgetManager.INVALID_APPWIDGET_ID);

               }

               if (widgetID == AppWidgetManager.INVALID_APPWIDGET_ID) {

                 finish();

               }

               resultValue = new Intent();

               resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetID);

               setResult(RESULT_CANCELED, resultValue);

               setContentView(R.layout.config_digitclock);

           }

          

           public void onApply(View v){

                 int colorText = Color.WHITE;

                 int selColor = ((RadioGroup) findViewById(R.id.rgColor)).getCheckedRadioButtonId();

                 switch(selColor){

                 case R.id.radioRed:

                        colorText = Color.parseColor(getString(R.color.red));

                        break;

                 case R.id.radioGreen:

                        colorText = Color.parseColor(getString(R.color.green));

                        break;

                 case R.id.radioBlue:

                        colorText = Color.parseColor(getString(R.color.blue));

                        break;

                 }

                 int backgr = R.drawable.fon1;

                 int selBackgr = ((RadioGroup) findViewById(R.id.rgBack)).getCheckedRadioButtonId();

                 switch(selBackgr){

                 case R.id.radioBack1:

                        backgr = R.drawable.fon1;

                        break;

                 case R.id.radioBack2:

                        backgr = R.drawable.fon2;

                        break;

                 }

               SharedPreferences sp = getSharedPreferences("pref_digitclock", MODE_PRIVATE);

               Editor editor = sp.edit();

               editor.putInt("dg_color" + widgetID, colorText);

               editor.putInt("dg_backgr" + widgetID, backgr);

               editor.commit();

               AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);

               WidgetClock.widgetUp(this, appWidgetManager, widgetID);

               setResult(RESULT_OK, resultValue);

               finish();

           }

     

    }

     

    WidgetClock.java

    package ru.urok.digitclock;

    import java.util.Calendar;

    import android.app.AlarmManager;

    import android.app.PendingIntent;

    import android.appwidget.AppWidgetManager;

    import android.appwidget.AppWidgetProvider;

    import android.content.ComponentName;

    import android.content.Context;

    import android.content.Intent;

    import android.content.SharedPreferences;

    import android.content.SharedPreferences.Editor;

    import android.graphics.Bitmap;

    import android.graphics.Canvas;

    import android.graphics.Color;

    import android.graphics.Paint;

    import android.graphics.Typeface;

    import android.widget.RemoteViews;

     

    public class WidgetClock extends AppWidgetProvider {

           Calendar c;

           int hour, min, day, month, year;

           static int colorText, backgr;

           static SharedPreferences sp;

           static String time, date;

            @Override

             public void onEnabled(Context context) {

               super.onEnabled(context);

               long time = (long) Math.rint(System.currentTimeMillis()/60000);

               time = time*60000 + 60000;

               Intent intent = new Intent(context, WidgetClock.class);

               intent.setAction("update_all_widgets");

               PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

               AlarmManager alarmManager = (AlarmManager) context

                   .getSystemService(Context.ALARM_SERVICE);

               alarmManager.setRepeating(AlarmManager.RTC, time,

                   60000, pIntent);

             }

             @Override

             public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

               super.onUpdate(context, appWidgetManager, appWidgetIds);

               sp = context.getSharedPreferences("pref_digitclock", Context.MODE_PRIVATE);

               c = Calendar.getInstance();

               hour = c.get(Calendar.HOUR_OF_DAY);

               min = c.get(Calendar.MINUTE);

               day = c.get(Calendar.DAY_OF_MONTH);

               month = c.get(Calendar.MONTH);

               year = c.get(Calendar.YEAR);

               String h = Integer.toString(hour);

               String m = Integer.toString(min);

               if(h.length()<2)h = "0" + h;

               if(m.length()<2)m = "0" + m;

               time = h + ":" + m;

               date = Integer.toString(day) +" " + MonthAsString(month, context) + " " + Integer.toString(year);

              for (int id : appWidgetIds) {

                  widgetUp(context, appWidgetManager, id);

              }

             }

             @Override

             public void onDeleted(Context context, int[] appWidgetIds) {

               super.onDeleted(context, appWidgetIds);

              Editor editor = context.getSharedPreferences("pref_digitclock", Context.MODE_PRIVATE).edit();

              for (int widgetID : appWidgetIds) {

                     editor.remove("dg_color" + widgetID);

                     editor.remove("dg_backgr" + widgetID);

             }

             editor.commit();

             }

             @Override

             public void onDisabled(Context context) {

               super.onDisabled(context);

               Intent intent = new Intent(context, WidgetClock.class);

               intent.setAction("update_all_widgets");

               PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

               AlarmManager alarmManager = (AlarmManager) context

                   .getSystemService(Context.ALARM_SERVICE);

               alarmManager.cancel(pIntent);

             }

             @Override

             public void onReceive(Context context, Intent intent) {

               super.onReceive(context, intent);

               if(intent.getAction().equalsIgnoreCase("update_all_widgets")){

                  ComponentName thisAppWidget = new ComponentName(

                                  context.getPackageName(), getClass().getName());

                        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

                              int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);

                              onUpdate(context, appWidgetManager, ids);

               }

             }

           

             static Bitmap convertToImg(String text, Context context, int colorText)

               {

                   Bitmap btmText = Bitmap.createBitmap(230, 60, Bitmap.Config.ARGB_4444);

                   Canvas cnvText = new Canvas(btmText);

                   Typeface tf = Typeface.createFromAsset(context.getAssets(),"fonts/a_LCDNovaObl.ttf");

                   Paint paint = new Paint();

                   paint.setAntiAlias(true);

                   paint.setSubpixelText(true);

                   paint.setTypeface(tf);

                   paint.setColor(colorText);

                   paint.setTextSize(50);

                   cnvText.drawText(text, 50, 50, paint);

                   return btmText;

               }

     

             private String MonthAsString(int month, Context context){

                        switch(month){

                        case 0:

                               return context.getString(R.string.Jan);

                        case 1:

                               return context.getString(R.string.Feb);

                        case 2:

                               return context.getString(R.string.Mar);

                        case 3:

                               return context.getString(R.string.Apr);

                        case 4:

                               return context.getString(R.string.May);

                        case 5:

                               return context.getString(R.string.Jun);

                        case 6:

                               return context.getString(R.string.Jul);

                        case 7:

                               return context.getString(R.string.Aug);

                        case 8:

                               return context.getString(R.string.Sep);

                        case 9:

                               return context.getString(R.string.Okt);

                        case 10:

                               return context.getString(R.string.Nov);

                        case 11:

                               return context.getString(R.string.Dec);

                        default:

                               return "Err";

                        }

             }

            

             static void widgetUp(Context context, AppWidgetManager appWidgetManager, int widgetID){

                   RemoteViews widgetView = new RemoteViews(context.getPackageName(), R.layout.clock_layout);

                   colorText = sp.getInt("dg_color" + widgetID, Color.WHITE);

                   backgr = sp.getInt("dg_backgr" + widgetID, 0);

                   widgetView.setImageViewBitmap(R.id.ivTime, convertToImg(time, context, colorText));

                   widgetView.setTextViewText(R.id.tvDate, date);

                   widgetView.setTextColor(R.id.tvDate, colorText);

                   widgetView.setInt(R.id.llBack, "setBackgroundResource", backgr);

                   appWidgetManager.updateAppWidget(widgetID, widgetView);

              }

     }

     

    manifest_digitclock.xml

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

        package="ru.urok.digitclock"

        android:versionCode="1"

        android:versionName="1.0" >

        <uses-sdk

            android:minSdkVersion="14"

            android:targetSdkVersion="14" />

        <application

            android:allowBackup="true"

            android:icon="@drawable/ic_launcher"

            android:label="@string/app_name"

            android:theme="@style/AppTheme" >

            <receiver android:name="ru.urok.digitclock.WidgetClock" android:icon="@drawable/ic_launcher"                                                                           android:label="@string/label_widget">

                <intent-filter>

                    <action

                              android:name="android.appwidget.action.APPWIDGET_UPDATE">

                    </action>

                </intent-filter>

                <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_metadata"/>

            </receiver>

            <activity android:name="ConfigActivity" android:theme="@android:style/Theme.Dialog">

                <intent-filter>

                    <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>

                </intent-filter>

            </activity>

        </application>

    </manifest>

     

     

    Категория: Андроид разработка | Добавил: Olelucoye (10.02.2015)
    Просмотров: 902 | Комментарии: 1
    | Рейтинг: 0.0/0
    Всего комментариев: 1
    1 sh0001   (30.07.2016 19:17)
    Добрый день. Спасибо автору за урок. У меня виджет обновляется не каждую минуту, а через разный интервал времени. С чем это может быть связано? На apk файл, а полностью проект можно будет где-нибудь скачать?

    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Меню сайта
    Категории раздела
    Андроид разработка [23]
    libGDX [24]
    Мои андроид проекты [6]
    Excel [7]
    Железяки [5]
    Скрипты в блокноте [4]
    Разное [1]
    Форма входа
    Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Яндекс Метрика
    Яндекс.Метрика