<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
 <title>Освой программирование играючи!</title>
 <link>http://developer.alexanderklimov.ru/</link>
 <description>Сайт для программистов</description>
 <language>ru-ru</language>
<webMaster>terminator2@mail.ru (Александр Климов)</webMaster>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/alexanderklimov/VJcl" /><feedburner:info uri="alexanderklimov/vjcl" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
<title>Кормим кота при помощи Android</title>
<link>http://feedproxy.google.com/~r/alexanderklimov/VJcl/~3/eEgYL6onQg0/catfood.php</link>
<description>&lt;p&gt;Damon Kohler в &lt;a href="http://www.damonkohler.com/2010/11/android-automated-cat-feeder.html"&gt;своем блоге&lt;/a&gt; рассказал, как собрал на базе Android устройство для автоматического кормления своей кошки. Устройство подает корм в чашку  по  установленному расписанию или по прямому запросу. Также устройство может передавать изображение с web-камеры. Включается устройство по Bluetooth и оборудовано для управления телефоном HTC Magic.&lt;/p&gt;

&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/vzuWgF_ukls?rel=0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;Сама программа управления устройством представляет собой скрипт на языке Python, который запускается на Android через &lt;b&gt;Scripting Layer for Android (SL4A)&lt;/b&gt;. Вся программа выглядит примерно так:&lt;/p&gt;

&lt;pre&gt;&lt;code class="python"&gt;
import android # See http://android-scripting.googlecode.com/
import gsd  # See http://getshitdone.googlecode.com/
import socket
import threading
import time

def feed(droid):
  droid.toggleBluetoothState(True)
  droid.bluetoothConnect('00001101-0000-1000-8000-00805F9B34FB', '00:06:66:04:b2:07')
  droid.bluetoothWrite('f')

class Server(gsd.App):
  def __init__(self, droid, webcam_url):
    self._droid = droid
    self._webcam_url = webcam_url

  def GET_(self, response):
    response.Render("""&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
  &amp;lt;title&amp;gt;Cat Feeder&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
  &amp;lt;img src=&amp;quot;%s&amp;quot;&amp;gt;
  &amp;lt;br&amp;gt;&amp;lt;a href=&amp;quot;/feed&amp;quot;&amp;gt;Feed!&amp;lt;/a&amp;gt;
  &amp;lt;/body&amp;gt;
  &amp;lt;/html&amp;gt;""" % self._webcam_url)

  def GET_feed(self, response):
    feed(self._droid)
    response.Redirect('/')

def timer(droid):
  feedings = [4, 10, 20]
  last_feeding = None
  while True:
    hour = time.localtime().tm_hour
    if hour in feedings and hour != last_feeding:
      feed(droid)
      last_feeding = hour
    time.sleep(300)

def GetIpAddress():
  s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
  s.connect(('google.com', 0))
  return s.getsockname()[0]

def main():
  droid = android.Android()
  droid.wakeLockAcquirePartial()
  webcam_url = 'http://%s:%d/' % tuple(droid.webcamStart(5, 80).result)
  server = Server(droid, webcam_url)
  port = 8080
  base_url = 'http://%s:%d/' % (GetIpAddress(), port)
  threading.Thread(target=server.Serve, args=('0.0.0.0', port)).start()
  threading.Thread(target=timer, args=(droid,)).start()
  droid.notify('Cat Feeder', 'Running on: %s' % base_url)
  
if __name__ == '__main__':
  main()
&lt;/code&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/alexanderklimov/VJcl/~4/eEgYL6onQg0" height="1" width="1"/&gt;</description>
<guid isPermaLink="false">http://developer.alexanderklimov.ru/android/catfood.php</guid>
<feedburner:origLink>http://developer.alexanderklimov.ru/android/catfood.php</feedburner:origLink></item>

<item>
<title>Виджет на главный экран</title>
<link>http://feedproxy.google.com/~r/alexanderklimov/VJcl/~3/InzIFzHTPRE/widget.php</link>
<description>&lt;p&gt;Кроме обычных приложений существуют еще виджеты, которые размещают на главном экране устройства. Смысл такого виджета заключаются в том, что мы сразу видим определенную информацию прямо на экране без необходимости запускать приложение. Например, можно вывести информацию о количестве непрочитанных писем, напоминание о встрече и т.д. Сегодня мы рассмотрим пример создания такого виджета.&lt;/p&gt;

&lt;p&gt;Наш виджет будет вычислять количество дней до главного праздника - Всемирного дня кошек, который отмечается 1 марта по всей Галактике.&lt;/p&gt;

&lt;p&gt;Создадим новый проект CatDaysWidget обычным способом. Добавим в проект значок и картинку, которая послужит нам фоном для виджета.&lt;/p&gt;

&lt;p&gt;Заменим строчки в res/values/strings.xml:&lt;/p&gt;

&lt;pre&gt;&lt;code class="xml"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;resources&amp;gt;
    &amp;lt;string name=&amp;quot;hello&amp;quot;&amp;gt;загружаем виджет...&amp;lt;/string&amp;gt;
    &amp;lt;string name=&amp;quot;app_name&amp;quot;&amp;gt;Всемирный День Кошек&amp;lt;/string&amp;gt;
&amp;lt;/resources&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Пока все как обычно. А теперь начинаются отличия. Так как мы создаем не обычное приложение, а виджет, нужно сообщить об этом Android. В виджетах не используются активности (Activity). Вместо них используются &lt;b&gt;receiver&lt;/b&gt; с мета-данными. Откройте манифест проекта, удалите теги &lt;b&gt;activity&lt;/b&gt; и вставьте новые строчки. Должно получиться так:&lt;/p&gt;

&lt;pre&gt;&lt;code class="xml"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;manifest xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    package=&amp;quot;ru.alexanderklimov.catday&amp;quot;
    android:versionCode=&amp;quot;1&amp;quot;
    android:versionName=&amp;quot;1.0&amp;quot; &amp;gt;

    &amp;lt;uses-sdk android:minSdkVersion=&amp;quot;10&amp;quot; /&amp;gt;

    &amp;lt;application
        android:icon=&amp;quot;@drawable/caticon&amp;quot;
        android:label=&amp;quot;@string/app_name&amp;quot; &amp;gt;

        &amp;lt;!-- Broadcast Receiver that will process AppWidget updates --&amp;gt;
        &amp;lt;receiver
            android:name=&amp;quot;.CatDaysWidgetActivity&amp;quot;
            android:label=&amp;quot;@string/app_name&amp;quot; &amp;gt;
            &amp;lt;intent-filter&amp;gt;
                &amp;lt;action android:name=&amp;quot;android.appwidget.action.APPWIDGET_UPDATE&amp;quot; /&amp;gt;
            &amp;lt;/intent-filter&amp;gt;

            &amp;lt;meta-data
                android:name=&amp;quot;android.appwidget.provider&amp;quot;
                android:resource=&amp;quot;@xml/hello_widget_provider&amp;quot; /&amp;gt;
        &amp;lt;/receiver&amp;gt;
    &amp;lt;/application&amp;gt;

&amp;lt;/manifest&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Далее откроем разметку main.xml из res/layout и модифицируем его. Следует запомнить, что виджет обладает меньшей функциональностью, чем обычное приложение. Поэтому не все элементы управления можно размещать в макете виджета. Элемент TextView входит в число разрешенных элементов и нам его вполне достаточно для вывода текста.&lt;/p&gt;

&lt;pre&gt;&lt;code class="xml"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;LinearLayout xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    android:layout_width=&amp;quot;fill_parent&amp;quot;
    android:layout_height=&amp;quot;fill_parent&amp;quot;
    android:background=&amp;quot;@drawable/paw&amp;quot;
    android:orientation=&amp;quot;vertical&amp;quot; &amp;gt;

    &amp;lt;TextView
        android:id=&amp;quot;@+id/catdayleft&amp;quot;
        android:layout_width=&amp;quot;fill_parent&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot;
        android:paddingLeft=&amp;quot;10dip&amp;quot;
        android:paddingTop=&amp;quot;35dip&amp;quot;
        android:text=&amp;quot;@string/hello&amp;quot;
        android:textColor=&amp;quot;#f11c8a&amp;quot;
        android:layout_gravity=&amp;quot;center&amp;quot; android:textStyle=&amp;quot;bold&amp;quot;/&amp;gt;

&amp;lt;/LinearLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Теперь нужно создать новую папку /res/xml и в ней файл &lt;b&gt;hello_widget_provider.xml&lt;/b&gt; с следующим содержанием:&lt;/p&gt;

&lt;pre&gt;&lt;code class="xml"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;appwidget-provider xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    android:initialLayout=&amp;quot;@layout/main&amp;quot;
    android:minHeight=&amp;quot;50dip&amp;quot;
    android:minWidth=&amp;quot;50dip&amp;quot;
    android:updatePeriodMillis=&amp;quot;10000&amp;quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Предварительные приготовления закончены, пора приступить к написанию программного кода. Открываем java-файл и пишем следующее:&lt;/p&gt;

&lt;pre&gt;&lt;code class="java"&gt;
package ru.alexanderklimov.catday;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Timer;
import java.util.TimerTask;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.widget.RemoteViews;

public class CatDaysWidgetActivity extends AppWidgetProvider {
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1,
				60000);
	}

	private class MyTime extends TimerTask {
		RemoteViews remoteViews;
		AppWidgetManager appWidgetManager;
		ComponentName thisWidget;

		public MyTime(Context context, AppWidgetManager appWidgetManager) {
			this.appWidgetManager = appWidgetManager;
			remoteViews = new RemoteViews(context.getPackageName(),
					R.layout.main);
			thisWidget = new ComponentName(context, CatDaysWidgetActivity.class);
		}

		@Override
		public void run() {
			Calendar thatDay = new GregorianCalendar(2012, 2, 1);
 		    Calendar today = Calendar.getInstance();
			
			long days = ((thatDay.getTimeInMillis() - today.getTimeInMillis()) / (24 * 60 * 60 * 1000)) + 1;
			
			remoteViews.setTextViewText(R.id.catdayleft, "Осталось дней: " + days);
			appWidgetManager.updateAppWidget(thisWidget, remoteViews);
		}
	}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;В методе &lt;b&gt;run()&lt;/b&gt; мы вычисляем количество дней между сегодняшней датой и 1 марта 2012 года. Обратите внимание, что отсчет месяцев начинается с 0, поэтому март - второй месяц. Так как время вычисляется в миллисекундах, то нужно разделить получившееся число на число миллисекунд, секунд, минут, часов, чтобы получить количество дней. Я также прибавил к результату еще один день, чтобы результат был более привычным.&lt;/p&gt;

&lt;p&gt;Запускайте проект в эмуляторе. Так как это не стандартное приложение, а виджет, то ничего на экране не появится. Нажмите на главной экране и удерживайте мышку некоторое время, чтобы появилось всплывающее меню. Выберите в нем пункт &lt;b&gt;Виджеты&lt;/b&gt; и найдите свой виджет.&lt;/p&gt;

&lt;img src="http://developer.alexanderklimov.ru/android/images/widget1.png" alt="Widget"&gt;

&lt;p&gt;Если все сделали правильно, то на главном экране устройстве у вас появится новый виджет, который будет отображать количество дней до главного кошачьего праздника! Позаботьтесь о подарке для кота заранее!&lt;/p&gt;

&lt;img src="http://developer.alexanderklimov.ru/android/images/widget2.png" alt="Наш Widget"&gt;

&lt;p&gt;Как видите, ничего сложного в создании виджетов для экранов ничего сложного. Позже мы рассмотрим и другие примеры.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/alexanderklimov/VJcl/~4/InzIFzHTPRE" height="1" width="1"/&gt;</description>
<guid isPermaLink="false">http://developer.alexanderklimov.ru/android/widget.php</guid>
<feedburner:origLink>http://developer.alexanderklimov.ru/android/widget.php</feedburner:origLink></item>

<item>
<title>Android. Настройка геолокации на эмуляторе</title>
<link>http://feedproxy.google.com/~r/alexanderklimov/VJcl/~3/cQyylpg_zZo/emulator-callnow.php</link>
<description>&lt;p&gt;Для настройки геолокационных данных используется группа &lt;b&gt;Location Control&lt;/b&gt;. Сначала вам надо раздобыть нужные координаты. Проще всего это сделать через браузер, если зайти по адресу &lt;noindex&gt;&lt;a href="http://maps.google.ru"&gt;maps.google.ru&lt;/a&gt;&lt;/noindex&gt;. Выберите нужное вам место, а затем выберите кнопку с изображением скрепки &lt;b&gt;Ссылка&lt;/b&gt;. В полученной ссылке содержатся необходимые данные. Предположим, у нас получилась строка &lt;i&gt;http://maps.google.ru/maps?ll=55.869555,37.503964&amp;spn=0.002459,0.006968&amp;t=v&amp;z=18&lt;/i&gt;. В этой строке после символов &lt;b&gt;ll=&lt;/b&gt; и находятся нужные нам значения &lt;b&gt;55.869555,37.503964&lt;/b&gt;. Эти значения можно вбить в соответствующие поля (режим Decimal).&lt;/p&gt;

&lt;img src="http://developer.alexanderklimov.ru/android/images/emulatorcontrol3.png" alt="Настройка геолокации"&gt;&lt;img src="http://feeds.feedburner.com/~r/alexanderklimov/VJcl/~4/cQyylpg_zZo" height="1" width="1"/&gt;</description>
<guid isPermaLink="false">http://developer.alexanderklimov.ru/android/emulator-callnow.php#geo</guid>
<feedburner:origLink>http://developer.alexanderklimov.ru/android/emulator-callnow.php#geo</feedburner:origLink></item>

<item>
<title>Android: RatingBar</title>
<link>http://feedproxy.google.com/~r/alexanderklimov/VJcl/~3/jMn4l6OlPww/ratingbar.php</link>
<description>&lt;p&gt;Виджет &lt;b&gt;RatingBar&lt;/b&gt; показывает значение рейтинга в виде звездочек. Можно установить рейтинг касанием пальца или с помощью клавиш курсора, используя заранее заданное количество звездочек.&lt;/p&gt;

&lt;p&gt;RatingBar находится в папке &lt;b&gt;Form Widgets&lt;/b&gt;&lt;/p&gt;

&lt;img src="http://developer.alexanderklimov.ru/android/views/ratingbar-tool.png" alt="RatingBar"&gt;

&lt;p&gt;Класс RatingBar является расширением классов &lt;b&gt;AbsSeekBar&lt;/b&gt; и &lt;b&gt;ProgressBar&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Для установки количества звёзд в режиме дизайна используется свойство &lt;b&gt;Num Stars&lt;/b&gt; (атрибут &lt;b&gt;android:numStars&lt;/b&gt;).&lt;/p&gt;

&lt;h2&gt;Методы&lt;/h2&gt;

&lt;p&gt;Для виджета RatingBar используются следующие методы:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;setNumStart(int)&lt;/b&gt; - устанавливает число звездочек&lt;/li&gt;
&lt;li&gt;&lt;b&gt;getRating()&lt;/b&gt; - возвращает значение рейтинга&lt;/li&gt;
&lt;li&gt;&lt;b&gt;setRating(float)&lt;/b&gt; - устанавливает значение рейтинга&lt;/li&gt;
&lt;li&gt;&lt;b&gt;isIndicator()&lt;/b&gt; - устанавливает в режим для чтения без возможности установить рейтинг пользователем&lt;/li&gt;
&lt;li&gt;&lt;b&gt;setStepSize(float)&lt;/b&gt; - устанавливает шаг приращения рейтинга&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Для отслеживания изменения рейтинга существует интерфейс &lt;b&gt;OnRatingBarChangeListener&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;У виджета есть два встроенных стиля &lt;b&gt;ratingBarStyleSmall&lt;/b&gt; (маленькие звёздочки) и &lt;b&gt;ratingBarStyleIndicator&lt;/b&gt; (большие звёзды), которые работают только в режиме индикатора, т.е. пользователь не может их изменять. Рассмотрим пример.&lt;/p&gt;

&lt;h3&gt;Пример с RatingBar&lt;/h3&gt;

&lt;p&gt;Расположим на экране три виджета RatingBar с разными стилями.&lt;/p&gt;

&lt;pre&gt;&lt;code class="xml"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;LinearLayout xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    android:layout_width=&amp;quot;fill_parent&amp;quot;
    android:layout_height=&amp;quot;fill_parent&amp;quot;
    android:orientation=&amp;quot;vertical&amp;quot; &amp;gt;

    &amp;lt;RatingBar
        android:id=&amp;quot;@+id/ratingbar_Indicator&amp;quot;
        style=&amp;quot;?android:attr/ratingBarStyleIndicator&amp;quot;
        android:layout_width=&amp;quot;wrap_content&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot; /&amp;gt;

    &amp;lt;RatingBar
        android:id=&amp;quot;@+id/ratingbar_Small&amp;quot;
        style=&amp;quot;?android:attr/ratingBarStyleSmall&amp;quot;
        android:layout_width=&amp;quot;wrap_content&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot;
        android:numStars=&amp;quot;10&amp;quot; /&amp;gt;

    &amp;lt;RatingBar
        android:id=&amp;quot;@+id/ratingbar_default&amp;quot;
        style=&amp;quot;?android:attr/ratingBarStyle&amp;quot;
        android:layout_width=&amp;quot;wrap_content&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot; /&amp;gt;

&amp;lt;/LinearLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Переходим к программной части.&lt;/p&gt;

&lt;pre&gt;&lt;code class="java"&gt;
setContentView(R.layout.main);

final RatingBar ratingBar_Small = (RatingBar)findViewById(R.id.ratingbar_Small);
final RatingBar ratingBar_Indicator = (RatingBar)findViewById(R.id.ratingbar_Indicator);
final RatingBar ratingBar_default = (RatingBar)findViewById(R.id.ratingbar_default);

ratingBar_default.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener(){

@Override
public void onRatingChanged(RatingBar ratingBar, float rating,
  boolean fromUser) {
    // TODO Auto-generated method stub
    ratingBar_Small.setRating(rating);
    ratingBar_Indicator.setRating(rating);
	     
    Toast toast = Toast.makeText(ViewsDemoActivity.this, "рейтинг: "+String.valueOf(rating),
            Toast.LENGTH_LONG);
    toast.setGravity(Gravity.CENTER, 0, 0);
     toast.show();
}});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Запускаем приложение, тыкаем лапкой в звёздочки в третьем ряду. Обратите внимание, что если коснуться левой части звезды, то можно установить половинку рейтинга. Благодаря событию &lt;b&gt;OnRatingBarChanged&lt;/b&gt;, мы можем отслеживать изменения рейтинга и устанавливать такое же значение у рейтингов-индикаторов.&lt;/p&gt;

&lt;p&gt;Подобный элемент управления можно использовать в приложениях, где требуется оценка чего-либо: музыкального альбома, кулинарного рецепта, степень пушистости кота и т.д.&lt;/p&gt;

&lt;img src="http://developer.alexanderklimov.ru/android/views/ratingbar.png" alt="RatingBar"&gt;&lt;img src="http://feeds.feedburner.com/~r/alexanderklimov/VJcl/~4/jMn4l6OlPww" height="1" width="1"/&gt;</description>
<guid isPermaLink="false">http://developer.alexanderklimov.ru/android/views/ratingbar.php</guid>
<feedburner:origLink>http://developer.alexanderklimov.ru/android/views/ratingbar.php</feedburner:origLink></item>

<item>
<title>Android: TextSwitcher</title>
<link>http://feedproxy.google.com/~r/alexanderklimov/VJcl/~3/DdXdI_U9Rp0/textswitcher.php</link>
<description>&lt;p&gt;Виджет &lt;b&gt;TextSwitcher&lt;/b&gt; находится в папке &lt;b&gt;Transitions&lt;/b&gt; и предназначен для анимированной смены текста. Обратите внимание, что в режиме дизайна элемент не отображается на экране, поэтому работу элемента необходимо смотреть на запущенном приложении.&lt;/p&gt;

&lt;img src="http://developer.alexanderklimov.ru/android/views/transitions.png" alt="Transitions widgets"&gt;

&lt;p&gt;Если использовать обычный TextView и выводить в нем новые сообщения, то текст будет выводиться мгновенно - предыдущий текст исчезает, а новый появляется вместо него. Но, если вам нужно сделать красиво, то TextSwitcher поможет вам.&lt;/p&gt;

&lt;p&gt;Общий принцип использования следующий - с помощью экземпляра класса ViewFactory создаются дочернии элементы TextView, который переключаются между собой с анимацией.&lt;/p&gt;

&lt;p&gt;Разместим на форме кнопку и TextSwitcher:&lt;/p&gt;

&lt;pre&gt;&lt;code class="xml"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;LinearLayout xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    android:layout_width=&amp;quot;fill_parent&amp;quot;
    android:layout_height=&amp;quot;fill_parent&amp;quot;
    android:orientation=&amp;quot;vertical&amp;quot; &amp;gt;

    &amp;lt;Button
        android:id=&amp;quot;@+id/button1&amp;quot;
        android:layout_width=&amp;quot;wrap_content&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot;
        android:onClick=&amp;quot;OnTextAnimationButtonClick&amp;quot;
        android:text=&amp;quot;Начать счёт&amp;quot; /&amp;gt;


    &amp;lt;TextSwitcher
        android:id=&amp;quot;@+id/textSwitcher1&amp;quot;
        android:layout_width=&amp;quot;match_parent&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot; &amp;gt;
    &amp;lt;/TextSwitcher&amp;gt;

&amp;lt;/LinearLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Теперь переходим к коду:&lt;/p&gt;

&lt;pre&gt;&lt;code class="java"&gt;
package ru.alexanderklimov.textswitcherdemo;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextSwitcher;
import android.widget.TextView;
import android.widget.ViewSwitcher;

public class TextSwitcherDemoActivity extends Activity implements
		ViewSwitcher.ViewFactory {

	private TextSwitcher mSwitcher;
	private int mCounter = 0;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		mSwitcher = (TextSwitcher) findViewById(R.id.textSwitcher1);
		mSwitcher.setFactory(this);

		Animation in = AnimationUtils.loadAnimation(this,
				android.R.anim.fade_in);
		Animation out = AnimationUtils.loadAnimation(this,
				android.R.anim.fade_out);
		mSwitcher.setInAnimation(in);
		mSwitcher.setOutAnimation(out);

		updateCounter();

	}

	public void OnTextAnimationButtonClick(View v) {
		mCounter++;
		updateCounter();
	}

	private void updateCounter() {
		mSwitcher.setText(String.valueOf(mCounter));
	}

	public View makeView() {
		TextView t = new TextView(this);
		t.setGravity(Gravity.CENTER | Gravity.CENTER_HORIZONTAL);
		t.setTextSize(70);
		t.setTextColor(Color.RED);
		return t;
	}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Данный пример немного похож на &lt;a href="http://developer.alexanderklimov.ru/android/android3.php"&gt;пример подсчета ворон&lt;/a&gt;, только на этот раз результаты выводим не в текстовом поле, а в TextView с анимацией. На скриншоте этого не увидеть, поэтому нужно попробовать пример на эмуляторе или устройстве. Если приглядеться, то можно увидеть у второй цифры 3 тень от следующей цифры 4.&lt;/p&gt;

&lt;img src="http://developer.alexanderklimov.ru/android/views/textswitcher.png" alt="TextSwitcher"&gt;

&lt;p&gt;На что обратить внимание - мы используем системные анимации &lt;b&gt;android.R.anim.fade_in&lt;/b&gt; и &lt;b&gt;android.R.anim.fade_out&lt;/b&gt;. Поэтому нам не нужно создавать файлы XML для анимации и сохранять их в res/anim, как мы это делали в некоторых уроках. Метод &lt;b&gt;setFactory&lt;/b&gt; позволяет указать нужный класс. Метод &lt;b&gt;makeView()&lt;/b&gt; является обязательным. Он должен возвращать элемент View подходящего типа, в нашем случае TextView. Заметьте, что в методе &lt;b&gt;makeView()&lt;/b&gt; мы формируем своеобразный шаблон (размер, цвет, позиция) для TextView, а вывод содержимого формируется в других методах.&lt;/p&gt;

&lt;p&gt;Откровенно говоря, большой пользы от данного виджета в проектах не вижу.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/alexanderklimov/VJcl/~4/DdXdI_U9Rp0" height="1" width="1"/&gt;</description>
<guid isPermaLink="false">http://developer.alexanderklimov.ru/android/views/textswitcher.php</guid>
<feedburner:origLink>http://developer.alexanderklimov.ru/android/views/textswitcher.php</feedburner:origLink></item>

<item>
<title>Android. Настраиваем заголовок экрана</title>
<link>http://feedproxy.google.com/~r/alexanderklimov/VJcl/~3/8RZl5kdfDOA/customtitlebar.php</link>
<description>&lt;p&gt;Если вам надоел стандартный заголовок у активности и хочется чего-то новенького и экстраординарного, то следующий урок для вас.&lt;/p&gt;

&lt;p&gt;Создадим новый макет &lt;b&gt;customtitlebar.xml&lt;/b&gt;, состоящий из пары элементов TextView и одного ProgressBar:&lt;/p&gt;

&lt;pre&gt;&lt;code class="xml"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;RelativeLayout xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    android:id=&amp;quot;@+id/RelativeLayout01&amp;quot;
    android:layout_width=&amp;quot;fill_parent&amp;quot;
    android:layout_height=&amp;quot;fill_parent&amp;quot; &amp;gt;

    &amp;lt;TextView
        android:id=&amp;quot;@+id/titleTvLeft&amp;quot;
        android:layout_width=&amp;quot;wrap_content&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot;
        android:text=&amp;quot;left&amp;quot; &amp;gt;
    &amp;lt;/TextView&amp;gt;

    &amp;lt;TextView
        android:id=&amp;quot;@+id/titleTvRight&amp;quot;
        android:layout_width=&amp;quot;wrap_content&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot;
        android:layout_alignParentRight=&amp;quot;true&amp;quot;
        android:text=&amp;quot;right&amp;quot; &amp;gt;
    &amp;lt;/TextView&amp;gt;

    &amp;lt;ProgressBar
        android:id=&amp;quot;@+id/leadProgressBar&amp;quot;
        style=&amp;quot;?android:attr/progressBarStyleSmall&amp;quot;
        android:layout_width=&amp;quot;wrap_content&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot;
        android:layout_centerVertical=&amp;quot;true&amp;quot;
        android:layout_toRightOf=&amp;quot;@+id/titleTvLeft&amp;quot;
        android:paddingLeft=&amp;quot;3dip&amp;quot;
        progressBarStyleSmall=&amp;quot;&amp;quot; &amp;gt;
    &amp;lt;/ProgressBar&amp;gt;

&amp;lt;/RelativeLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Элементы TextView нужны для вывода текста с левой и правой стороны заголовка. Например, с левой части можно вывести название приложения, а справа какой-нибудь дополнительный текст. Постарайтесь избежать длинной строки справа (не более 20 символов), иначе он будет обрезаться.&lt;/p&gt;

&lt;p&gt;Теперь переходим непосредственно к коду:&lt;/p&gt;

&lt;pre&gt;&lt;code class="java"&gt;
boolean customTitleSupported;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);

	// Проверяем, поддерживается свой заголовок перед выводом экрана!
	customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

	setContentView(R.layout.main);

	// Устанавливаем свой текст для левой и правой части заголовка
	customTitleBar("Кот", "Кошка");
}

public void customTitleBar(String left, String right) {
	if (right.length() &amp;gt; 20)
		right = right.substring(0, 20);
	// Устанавливаем свой заголовок
	if (customTitleSupported) {
		getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
				R.layout.customtitlebar);
		TextView titleTvLeft = (TextView) findViewById(R.id.titleTvLeft);
		TextView titleTvRight = (TextView) findViewById(R.id.titleTvRight);

		titleTvLeft.setText(left);
		titleTvRight.setText(right);

		ProgressBar titleProgressBar;
		titleProgressBar = (ProgressBar) findViewById(R.id.leadProgressBar);

		// Если нужно скрыть индикатор прогресса, расскоментируйте эту строчку
		// titleProgressBar.setVisibility(ProgressBar.GONE);
	}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Запускаем проект и видим интересный заголовок, у которого текст расположен с двух сторон, а между ними крутится индикатор прогресса.&lt;/p&gt;

&lt;img src="http://developer.alexanderklimov.ru/android/images/customtitlebar.png"&gt;&lt;img src="http://feeds.feedburner.com/~r/alexanderklimov/VJcl/~4/8RZl5kdfDOA" height="1" width="1"/&gt;</description>
<guid isPermaLink="false">http://developer.alexanderklimov.ru/android/customtitlebar.php</guid>
<feedburner:origLink>http://developer.alexanderklimov.ru/android/customtitlebar.php</feedburner:origLink></item>

<item>
<title>Android. Button. Кнопка вверх тормашками</title>
<link>http://feedproxy.google.com/~r/alexanderklimov/VJcl/~3/w0vofuLmr0c/button.php</link>
<description>&lt;p&gt;Создадим необычную кнопку, расположенную вверх тормашками!&lt;/p&gt;

&lt;p&gt;Создадим новый класс, который будет наследоваться от класса Button:&lt;/p&gt;

&lt;pre&gt;&lt;code class="java"&gt;
// файл InvertedButton.java
package ru.alexanderklimov.views;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.Button;

public class InvertedButton extends Button {
    public InvertedButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setWillNotDraw(false);
        setGravity(Gravity.CENTER);
    }

    public InvertedButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        setWillNotDraw(false);
        setGravity(Gravity.CENTER);
    }

    public InvertedButton(Context context) {
        super(context);
        setWillNotDraw(false);
        setGravity(Gravity.CENTER);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int left = getPaddingLeft();
        int top = getPaddingTop();
        int right = getPaddingRight();
        int bottom = getPaddingBottom();
        int width = getWidth() - left - right;
        int height = getHeight() - top - bottom;
        
        int saveCount = canvas.getSaveCount();
        canvas.translate(left + width / 2, top + height / 2);
        canvas.rotate(-180);
        canvas.translate((-width / 2)-left, (-height / 2)-top);
        canvas.restoreToCount(saveCount);
        
        super.onDraw(canvas);
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Теперь в простом макете вашего шаблона добавим стандартную и нашу необычную кнопку:&lt;/p&gt;

&lt;pre&gt;&lt;code class="xml"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;LinearLayout xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    android:layout_width=&amp;quot;match_parent&amp;quot;
    android:layout_height=&amp;quot;match_parent&amp;quot;
    android:orientation=&amp;quot;vertical&amp;quot; &amp;gt;

    &amp;lt;Button
        android:id=&amp;quot;@+id/button1&amp;quot;
        android:layout_width=&amp;quot;wrap_content&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot;
        android:layout_gravity=&amp;quot;center_horizontal|bottom&amp;quot;
        android:text=&amp;quot;Нормальная кнопка&amp;quot; /&amp;gt;

    &amp;lt;ru.alexanderklimov.views.InvertedButton
        android:id=&amp;quot;@+id/button2&amp;quot;
        android:layout_width=&amp;quot;wrap_content&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot;
        android:layout_gravity=&amp;quot;center_horizontal|bottom&amp;quot;
        android:text=&amp;quot;Вверх тормашками&amp;quot;
        android:textStyle=&amp;quot;bold&amp;quot; &amp;gt;
    &amp;lt;/ru.alexanderklimov.views.InvertedButton&amp;gt;

&amp;lt;/LinearLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Уже сейчас в графическом режиме просмотра макета вы можете увидеть удивительную кнопку. Запускаем проект и смотрим на нее уже удивленными глазами.&lt;/p&gt;

&lt;img src="http://developer.alexanderklimov.ru/android/views/button-up.png" alt="Кнопка вверх ногами"&gt;

&lt;p&gt;Вся магия сосредоточена в методе &lt;b&gt;onDraw()&lt;/b&gt;, где мы вращаем объект Canvas. Также проводим некоторые вычисления для точного позиционирования текста.&lt;/p&gt;

&lt;p&gt;Зачем это нужно? Чтобы взглянуть на проблему под другим углом!&lt;/p&gt;

&lt;img src="http://developer.alexanderklimov.ru/android/views/up.jpg" alt="o_O"&gt;&lt;img src="http://feeds.feedburner.com/~r/alexanderklimov/VJcl/~4/w0vofuLmr0c" height="1" width="1"/&gt;</description>
<guid isPermaLink="false">http://developer.alexanderklimov.ru/android/views/button.php#up</guid>
<feedburner:origLink>http://developer.alexanderklimov.ru/android/views/button.php#up</feedburner:origLink></item>

<item>
<title>Android. Касания сенсорного экрана</title>
<link>http://feedproxy.google.com/~r/alexanderklimov/VJcl/~3/dXCEIctPe9s/touch.php</link>
<description>&lt;p&gt;Телефоны обрели новую жизнь, когда появились тачскрины (или правильнее говорить сенсорные экраны). Аппаратные кнопки стали уходить в прошлое. Нам необходимо научиться работать с касаниями экрана. Стоит отметить, когда мы касаемся пальцем (или лапой) кнопки, то срабатывает событие Click, с которым мы можем работать. Но, предположим, что у вас на весь экран расположена картинка кота, и нам нужно распознавать касания в разных частях экрана. Если мы касаемся области живота, кот должен довольно урчать, а если мы задели его хвост, то он должен заругаться кошачьим матом, потому что хвост - это святое.&lt;/p&gt;

&lt;p&gt;Кроме того, появилось понятие мультитача, когда экрана касаются не одним пальцем, а сразу двумя и больше.&lt;/p&gt;

&lt;p&gt;Иными словами, нам нужно уметь распознавать касания экрана и определять кооординаты касания. Для этого случая существует отдельный метод &lt;b&gt;onTouchEvent()&lt;/b&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code class="java"&gt;
@Override
public boolean onTouchEvent(MotionEvent event) {
	// MotionEvent хранит координаты X-Y
	if(event.getAction() == MotionEvent.ACTION_DOWN) {
		String text = "Вы коснулись экрана в точке x = " + event.getX() + " and y = " + event.getY();
		Toast.makeText(this, text, Toast.LENGTH_LONG).show();
	}

	return super.onTouchEvent(event);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Запустите проект и потыкайте пальцем в разные участки экрана. Всплывающее сообщение покажет вам координаты касания. При этом, если на экране у вас есть кнопка, то наш метод не сработает. Так как кнопка имеет свой метод для обработки касания, который имеет приоритет перед простым касанием.&lt;/p&gt;

&lt;p&gt;Для закрепления материала, еще один пример - выводим размеры экрана при нажатии пальцем на экран&lt;/p&gt;

&lt;pre&gt;&lt;code class="java"&gt;
@Override
public boolean onTouchEvent(MotionEvent event) {
	Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

	if(event.getAction() == MotionEvent.ACTION_DOWN) {
		String text = "W: " + display.getWidth() + " | H: " + display.getHeight();
		Toast.makeText(this, text, Toast.LENGTH_LONG).show();
	}

	return super.onTouchEvent(event);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="motionevent"&gt;Класс MotionEvent&lt;/h2&gt;

&lt;p&gt;Класс &lt;b&gt;MotionEvent&lt;/b&gt; служит хранилищем данных о прикосновении (touch event). Каждый раз, когда пользователь проводит пальцем по экрану, или просто касается его, создается целая последовательность экземпляров класса MotionEvent: последовательность начинается, когда пользователь дотрагивается до экрана, продолжается, пока пользователь двигает палец по экрану, и кончается, когда пользователь поднимает палец. Таким образом получается три основных типа действия, которые описывает MotionEvent: опускание пальца, его передвижение и поднятие. Каждый MotionEvent хранит в себе информацию о типе действия, которое он описывает. Для этого в классе MotionEvent предусмотрены константы:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;int MotionEvent.ACTION_DOWN&lt;/b&gt; — пользователь опускает палец на экран&lt;/li&gt;
&lt;li&gt;&lt;b&gt;int MotionEvent.ACTION_MOVE&lt;/b&gt; — пользователь передвигает пальцем по экрану&lt;/li&gt;
&lt;li&gt;&lt;b&gt;int MotionEvent.ACTION_UP&lt;/b&gt; — пользователь поднимает палец с экрана&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Распознать происходящее событие можно с помощью метода &lt;b&gt;getAction()&lt;/b&gt;. Также существует еще один тип действия — &lt;b&gt;MotionEvent.ACTION_CANCEL&lt;/b&gt;, который сообщает, что последовательность завершена некорректно, то есть без MotionEvent.ACTION_UP.&lt;/p&gt;

&lt;h2 id="handle"&gt;Обработка событий класса MotionEvent&lt;/h2&gt;

&lt;p&gt;Вначале статьи мы уже видели пример обработки касаний экрана. Чтобы увидеть все действия - касание пальцем, движение по экрану и подъем пальца - можно написать еще один пример.&lt;/p&gt;

&lt;pre&gt;&lt;code class="java"&gt;
@Override
public boolean onTouchEvent(MotionEvent event) {
	
	Float X = (Float) event.getX();
	Float Y = (Float) event.getY();
	int Action = event.getAction();
	String ActionString = "";
     switch(Action) 
     { 
         case MotionEvent.ACTION_DOWN: 
        	 ActionString="ACTION_DOWN";
        	 Toast.makeText(this, ActionString + " Координаты: " + X.toString()+" x "+Y.toString(), Toast.LENGTH_SHORT).show();
        	 break; 
         case MotionEvent.ACTION_MOVE: 
        	 ActionString="ACTION_MOVE";
        	 Toast.makeText(this, ActionString, Toast.LENGTH_SHORT).show();
        	 break; 
         case MotionEvent.ACTION_UP: 
        	 ActionString="ACTION_UP";
        	 Toast.makeText(this, ActionString, Toast.LENGTH_SHORT).show();
        	 break; 
     } 
	return super.onTouchEvent(event);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;В этом примере вы снова видите, как получить координаты касания экрана, а также возникающие события. Запустите пример, нажммите на экран, сдвиньте палец в сторону и отпустите палец. Единственное, что нужно помнить, что при движении создается очень много экземпляров MotionEvent, поэтому в этом примере постарайтесь долго не держать палец на экране. Иначе вам придется долго ждать окончания очереди сообщений о событии ACTION_MOVE.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/alexanderklimov/VJcl/~4/dXCEIctPe9s" height="1" width="1"/&gt;</description>
<guid isPermaLink="false">http://developer.alexanderklimov.ru/android/touch.php</guid>
<feedburner:origLink>http://developer.alexanderklimov.ru/android/touch.php</feedburner:origLink></item>

<item>
<title>Android. Советы. Узнать размеры экрана</title>
<link>http://feedproxy.google.com/~r/alexanderklimov/VJcl/~3/AYtHH7Y3A0M/tips-android.php</link>
<description>&lt;p&gt;Для вычисления размеров экрана можно воспользоваться двумя способами. Второй способ более правильный.&lt;/p&gt;

&lt;pre&gt;&lt;code class="java"&gt;
TextView tvResult = (TextView)findViewById(R.id.textView1);

// Узнаем размеры экрана из ресурсов
DisplayMetrics displaymetrics = getResources().getDisplayMetrics();

// узнаем размеры экрана из класса Display
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metricsB = new DisplayMetrics();
display.getMetrics(metricsB);

tvResult.setText(
		"[Используя ресурсы] \n" +
    	"Ширина: " + displaymetrics.widthPixels + "\n" +
    	"Высота: " + displaymetrics.heightPixels + "\n"
    	+ "\n" +
    	"[Используя Display] \n" +
    	"Ширина: " + metricsB.widthPixels + "\n" +
    	"Высота: " + metricsB.heightPixels + "\n"
    );
&lt;/code&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/alexanderklimov/VJcl/~4/AYtHH7Y3A0M" height="1" width="1"/&gt;</description>
<guid isPermaLink="false">http://developer.alexanderklimov.ru/android/tips-android.php#screensize</guid>
<feedburner:origLink>http://developer.alexanderklimov.ru/android/tips-android.php#screensize</feedburner:origLink></item>

<item>
<title>Android: Анимация для кнопок</title>
<link>http://feedproxy.google.com/~r/alexanderklimov/VJcl/~3/DYv5vXR_8xI/button.php</link>
<description>&lt;p&gt;Применим анимационные эффекты к кнопкам&lt;p&gt;

&lt;h3&gt;Эффект Alpha: Изменение прозрачности&lt;/h3&gt;

&lt;p&gt;Создадим анимацию изменения прозрачности кнопки до полного исчезновения и обратно&lt;/p&gt;

&lt;h4&gt;res/anim/alpha.xml&lt;/h4&gt;

&lt;pre&gt;&lt;code class="xml"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;set xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    android:interpolator=&amp;quot;@android:anim/linear_interpolator&amp;quot; &amp;gt;

    &amp;lt;alpha
        android:duration=&amp;quot;500&amp;quot;
        android:fromAlpha=&amp;quot;1.0&amp;quot;
        android:repeatCount=&amp;quot;1&amp;quot;
        android:repeatMode=&amp;quot;reverse&amp;quot;
        android:toAlpha=&amp;quot;0.1&amp;quot; /&amp;gt;

&amp;lt;/set&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Нажимаем на кнопку&lt;/h4&gt;

&lt;pre&gt;&lt;code class="java"&gt;
Button buttonAlpha = (Button)findViewById(R.id.buttonAlpha);
final Animation animAlpha = AnimationUtils.loadAnimation(this, R.anim.alpha);

buttonAlpha.setOnClickListener(new OnClickListener() {
	@Override
	public void onClick(View v) {
		v.startAnimation(animAlpha);
	}
});
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Эффект Rotate: Вращение кнопки&lt;/h3&gt;

&lt;p&gt;Заставим кнопку вращаться при нажатии. Карлсону, который живет на крыше, эта кнопка понравится.&lt;/p&gt;

&lt;h4&gt;res/anim/rotate.xml&lt;/h4&gt;

&lt;pre&gt;&lt;code class="xml"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;set xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    android:interpolator=&amp;quot;@android:anim/linear_interpolator&amp;quot; &amp;gt;

    &amp;lt;rotate
        android:duration=&amp;quot;500&amp;quot;
        android:fromDegrees=&amp;quot;0&amp;quot;
        android:pivotX=&amp;quot;50%&amp;quot;
        android:pivotY=&amp;quot;50%&amp;quot;
        android:repeatCount=&amp;quot;1&amp;quot;
        android:repeatMode=&amp;quot;reverse&amp;quot;
        android:startOffset=&amp;quot;0&amp;quot;
        android:toDegrees=&amp;quot;360&amp;quot; /&amp;gt;

&amp;lt;/set&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Нажимаем на кнопку&lt;/h4&gt;

&lt;pre&gt;&lt;code class="java"&gt;
Button buttonRotate = (Button)findViewById(R.id.buttonRotate);
final Animation animRotate = AnimationUtils.loadAnimation(this, R.anim.rotate);

buttonRotate.setOnClickListener(new OnClickListener() {
	@Override
	public void onClick(View v) {
		v.startAnimation(animRotate);				
	}
});
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Эффект Scale: Изменение размеров&lt;/h3&gt;

&lt;p&gt;Делаем из мухи слона, т.е. меняем размеры кнопки&lt;/p&gt;

&lt;h4&gt;res/anim/scale.xml&lt;/h4&gt;

&lt;pre&gt;&lt;code class="xml"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;set xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    android:interpolator=&amp;quot;@android:anim/linear_interpolator&amp;quot; &amp;gt;

    &amp;lt;scale
        android:duration=&amp;quot;500&amp;quot;
        android:fromXScale=&amp;quot;1.0&amp;quot;
        android:fromYScale=&amp;quot;1.0&amp;quot;
        android:pivotX=&amp;quot;50%&amp;quot;
        android:pivotY=&amp;quot;50%&amp;quot;
        android:repeatCount=&amp;quot;1&amp;quot;
        android:repeatMode=&amp;quot;reverse&amp;quot;
        android:toXScale=&amp;quot;3.0&amp;quot;
        android:toYScale=&amp;quot;3.0&amp;quot; /&amp;gt;

&amp;lt;/set&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Нажимаем на кнопку&lt;/h4&gt;

&lt;pre&gt;&lt;code class="java"&gt;
Button buttonScale = (Button)findViewById(R.id.buttonScale);
final Animation animScale = AnimationUtils.loadAnimation(this, R.anim.scale);

buttonScale.setOnClickListener(new OnClickListener() {
	@Override
	public void onClick(View v) {
		v.startAnimation(animScale);				
	}
});
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Эффект Translate: Перемещение кнопки&lt;/h3&gt;

&lt;p&gt;Переместим кнопку на новое место&lt;/p&gt;

&lt;h4&gt;res/anim/translate.xml&lt;/h4&gt;

&lt;pre&gt;&lt;code class="xml"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;set xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    android:interpolator=&amp;quot;@android:anim/linear_interpolator&amp;quot; &amp;gt;

    &amp;lt;translate
        android:duration=&amp;quot;500&amp;quot;
        android:fromXDelta=&amp;quot;0&amp;quot;
        android:repeatCount=&amp;quot;1&amp;quot;
        android:repeatMode=&amp;quot;reverse&amp;quot;
        android:toXDelta=&amp;quot;100%p&amp;quot; /&amp;gt;

&amp;lt;/set&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Щелчок на кнопке&lt;/h4&gt;

&lt;pre&gt;&lt;code class="java"&gt;
Button buttonTranslate = (Button)findViewById(R.id.buttonTranslate);
final Animation animTranslate = AnimationUtils.loadAnimation(this, R.anim.translate);

buttonTranslate.setOnClickListener(new OnClickListener() {
	@Override
	public void onClick(View v) {
		v.startAnimation(animTranslate);				
	}
});
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Посмотреть видео&lt;/h3&gt;

&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/UiKBpj9lEBI?rel=0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;Источник примеров для анимаций кнопок: &lt;noindex&gt;&lt;a href="http://android-er.blogspot.com/2012/02/apply-animation-on-button.html" &gt;Android-er: Apply animation on Button&lt;/a&gt;&lt;/noindex&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/alexanderklimov/VJcl/~4/DYv5vXR_8xI" height="1" width="1"/&gt;</description>
<guid isPermaLink="false">http://developer.alexanderklimov.ru/android/views/button.php#animation</guid>
<feedburner:origLink>http://developer.alexanderklimov.ru/android/views/button.php#animation</feedburner:origLink></item>

</channel>
</rss>

