Text
Войны опаленные годы Душевною скорбью жгут грудь. Все вынесли деды невзгоды — Никто не сумел их согнуть. Не выцветет дедов отвага! И вечный не гаснет огонь. Пусть древко победного флага Не выронит внуков ладонь! Сжимаются в памяти сроки Тревожных и огненных лет, Но чтут нас, и наши истоки Сияют лучами побед. Легли на гранитные плиты Цветы словно памяти дань. Знать, хватит начал для защиты, Коль грянет смертельная брань.
0 notes
Text
<a> </a> - ссылка
href=“” атрибут ссылки
<DOCTYPE html>
0 notes
Text
Алгебра: номер 27.36,37,48,49,50,51а
Физика: номер 1099,1100,1102, параграфы 2.8-2.9
Геометрия: параграф 19, пункты 1,3,4,5 учить, пункт 2 читать, вспомнить всю теорию по окружностям Номер 116б, 124, 130
Всеобщая история: параграф 13 страницы 114-118
Английский 2,3 на странице 104
Литра: стр 254-259, задание 6 стр 311 устно
0 notes
Text
Прежде чем приступить к экспериментам, приведем основные функции класса Canvas для рисования графических примитивов. В таблице 3.12 приведены основные методы для рисования с помощью Canvas.
МетодНазначение
drawARGB()/drawRGB()/drawColor()Заполняет холст сплошным цветом
drawArc()Рисует дугу между двумя углами внутри заданной прямоугольной области
drawBitmap()Рисует растровое изображение на холсте
drawCircle()Рисует окружность с определенным радиусом вокруг заданной точки
drawLine(s)()Рисует линию (или последовательность линий) между двумя точками
drawOval()Рисует овал на основе прямоугольной области
drawPaint()Закрашивает весь холст с помощью заданного объекта Paint
drawPath()Рисует указанный контур, используется для хранения набора графических примитивов в виде единого объекта
drawPicture()Рисует объект Picture внутри заданного прямоугольника
drawPoint()Рисует точку в заданном месте
drawRect()Рисует прямоугольник
drawText()Рисует текстовую строку на холсте
rotate() и restore()Вращение холста
scale() и translate()Изменение и перемещение координатной системы
Табл. 3.12.
Более подробно с инструментами класса Canvas можно ознакомиться в официальной документации.
Пример 3.7
Как было сказано выше, вся работа с графикой происходит в методе onDraw() класса. Для начала установим цвет холста, на котором будем рисовать, пусть это будет белый цвет. При желании можно установить любой другой.
Для этого сразу после строчки super.onDraw(canvas) напишем код:
Paint paint = new Paint(); // Выбираем кисть paint.setStyle(Paint.Style.FILL); // Белый цвет кисти paint.setColor(Color.WHITE); // Закрашиваем холст canvas.drawPaint(paint);
0 notes
Text
Для рисования качественной графики можно вызывать методы, обеспечивающие сглаживание пикселей:
Paint paint = new Paint(); paint.setSubpixelText(true); // Субпиксельное сглаживание для текста paint.setAntiAlias(true); // Антиальясинг, сглаживание линий
Для представления цвета в Android обычно используют 32-битное целое число, а не экземпляры класса Color. Для задания цвета можно использовать статические константы класса Color, например:
int blue = Color.BLUE; Paint paint = new Paint(); paint.setColor(blue);
Такие константы описаны только для самых основных цветов. Цвет также можно описать с помощью четырех восьмибитных чисел в формате ARGB, по одному для каждого канала (Alpha, Red, Green, Blue). Напомним, что каждое восьмибитное целое беззнаковое число может принимать значения от 0 до 255. Получить нужный цвет из набора цветовых компонентов можно через методы rgb() или argb(), которые возвращают целые значения (код цвета).
// Полупрозрачный синий int myTransparentBlue = Color.argb(127, 0, 0, 255);
Метод parseColor() позволяет получить целочисленное значение из шестнадцатеричной формы:
int pColor = Color.parseColor("#FF0000FF");
Для большей гибкости приложения цвета помещают в ресурсы. В этом случае их можно будет менять без вмешательства в код программы:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="ballColor" >#FF00FFFF </color> </resources>
В коде программы можно обратиться к цвету следующим образом:
int ballColor = getResources().getColor(R.color.ballColor);
0 notes
Text
Для того чтобы удачно манипулировать методами жизненного цикла фрагмента, необходимо понимать, какие циклы после каких происходят. Переопределять данные методы (по аналогии с жизненным циклом активности) необходимо, только если нужно модифицировать логику фрагментов.
Ниже представлены основные методы жизненного цикла фрагмента (см. рис. 3.16).
onAttach(Activity) — вызывается после того, как фрагмент связывается с активностью.
onCreate(Bundle) — вызывается при создании фрагмента. В своей реализации разработчик должен ини��иализировать ключевые компоненты фрагмента, которые требуется сохранить, когда фрагмент находится в состоянии паузы или возобновлен после остановки.
onCreateView (LayoutInflater, ViewGroup, Bundle) — вызывается при первом отображении пользовательского интерфейса фрагмента на дисплее. Позволяет инициализировать компоненты с layout. На данном этапе мы уже имеем всю иерархию компонентов.
onActivityCreated(Bundle) — вызывается после того, как активность завершила свою обработку метода Activity.onCreate. Тут можно выполнять заключительные настройки интерфейса до того, как пользователь увидит фрагмент.
onStart() — похож на Activity.onStart(). Пользователь в момент вызова данного метода уже видит фрагмент, но еще не может взаимодействовать с ним.
onResume() — вызывается после возвращения к нашему фрагменту (аналогично как в активности). После этого пользователь видит наш фрагмент и может выполнить какие-то действия.
onPause() — если пользователь уходит на какую-то другую активность, то вызывается данный метод. Работа такая же, как в Activity.onPause() — останавливает наш фрагмент. Можно уходя с фрагмента, например, останавливать видео или звук.
onSaveInstanceState() — позволяет сохранять состояние фрагмента и восстановить его во время выполнения onCreate(), onCreateView() или onActivityCreated().
onStop() — связан с методом Activity, по логике выполняет то же, что и в Activity.onStop(). Останавливает работу нашего фрагмента. Но на этом жизненный цикл не заканчивается. После этого выполняется onDestroyView().
onDestroyView() — если фрагмент находится на пути уничтожения или сохранения, то следующим будет вызван именно этот метод — в данном методе мы можем возродить наш фрагмент.
onDestroy() — можно почистить ресурсы. Удалить те объекты, которые нам не нужно использовать.
onDetach() — отвязывает фрагмент от активности.
Фрагмент всегда должен быть встроен в Activity, и на его жизненный цикл напрямую влияет жизненный цикл Activi
0 notes
Text
Создание фрагмента практически ничем не отличается от создания активности. Для создания фрагмента требуется класс, унаследованный от класса Fragment.
public class MyFragment extends Fragment { }
В отличии от активности, при создании нового фрагмента не нужно его декларировать в файле Manifest.xml. Его фрагмент содержит методы, аналогичные (но не полностью) методам класса Activity, такие как onCreate(), onStart(), onPause() и onStop().
Обычно требуется обеспечить реализацию следующих методов:
onCreate(): вызывается при создании фрагмента; здесь инициализируются компоненты, которые нужно восстановить при возобновлении работы фрагмента после остановки;
onCreateView(): вызывается, когда нужно «нарисовать» фрагмент на экране в первый раз; этот метод должен возвращать представление (View), которое является корневым для вашего фрагмента;
onPause(): вызывается, когда пользователь покидает фрагмент и он (фрагмент) может быть уничтожен; здесь следует сохранить несохраненные данные, поскольку обратно к фрагменту пользователь может не вернуться.
Кроме класса Fragment, разработчику доступны несколько его п
0 notes
Text
Конкретный набор сенсоров зависит от Android-устройства, но в большинстве смартфонов и планшетов присутствуют самые основные — акселерометр и гироскоп. Для обработки событий, связанными с датчиками, в классе активности нужно реализовать интерфейс SensorEventListener:
public class MainActivity extends Activity implements SensorEventListener { }
В активности должны появиться следующие методы:
@Override // Изменение точности показаний датчика public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override protected void onResume() { } @Override protected void onPause() { } @Override // Изменение показаний датчиков public void onSensorChanged(SensorEvent event) { }
В методе OnCreate получим объект типа SensorManager — менеджер сенсоров устройства. С помощью этого объекта можно получить доступ к нужному сенсору. Далее показан фрагмент класса активности c получением сенсора — акселерометра:
public class MainActivity extends AppCompatActivity implements SensorEventListener { private final SensorManager mSensorManager; private final Sensor mAccelerometer; public SensorActivity() { mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } protected void onResume() { super.onResume(); mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); } protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); } public void onAccuracyChanged(Sensor sensor, int accuracy) { } public void onSensorChanged(SensorEvent event) { } }
Получение значений с датчика осуществляется с помощью объекта типа SensorEvent, который передается внутрь метода onSensorChanged.
0 notes
Text
Как и активности, сервисы должны быть продекларированы и описаны в манифесте приложения, для этого используется тег, являющийся дочерним тегом для:
<service android:name=".MyService"/>
Стоит подчеркнуть, что тег <service> может включать целый набор атрибутов. Например, такой как enabled, дает возможность другим приложениям получать доступ к вашему сервису
0 notes
Text
Для создания сервиса требуется создать дочерний класс для класса android.app. Service и переопределить несколько методов, которые будут, в итоге, определять характеристики создаваемого сервиса.
public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return null; } }
0 notes
Text
class Client extends Thread { Account account; public Client(Account acc) { account = acc; } @Override public void run() { // synchronized (account) { if (account.money - 70 > 0) { // достаточно ли средств ? try { sleep((long) (1000 * Math.random())); // имитируем задержку банкомата } catch (InterruptedException e) {} account.money -= 70; // снимаем со счета нужную сумму System.out.println(account.money); } else System.out.println("there are not enough funds on your account"); // } } }
Теперь имитируем одновременную попытку снятия денег:
public class SynchronizedLogic { public static Account account; class Account{ public double money; } public static void main(String[] args) { account=new SynchronizedLogic().new Account(); account.money=100.; Client client1=new Client(account); Client client2=new Client(account); client1.start(); client2.start(); } }
При выполнении этого примера на экран выведется:
30.0 -40.0
Что демонстрирует классический Data Races. Однако если раскомментировать конструкцию synchronized (account), которая принуждает потоки выполняться последовательно на участке проверки и уменьшения счета, то в этом случае вывод будет совершенно правильный с точки зрения логики работы банка:
30.0 there are not enough funds on your account
Применять блочную синхронизацию удобно, когда нужно синхронизировать не весь метод целиком. Например, вам нужно обеспечить чтение/изменение массива из разных потоков. Также если разработчик не имеет доступа к какому-либо методу, потому что не он его разработал. Тогда можно поместить вызов такого метода внутрь блока с синхронизацией.
0 notes
Text
Метод start() запускает новый поток и сам запустит метод run(). В таком случае мы получим асинхронные потоки, это значит, что мы не знаем заранее, в какой последовательности будут выполняться потоки. Не следует пытаться вызвать метод run() для объекта самостоятельно.
Ниже приведен пример работы трех асинхронных потоков, которые работают различное время, — проект LogicThreads.3.4.5.
class Work extends Thread { String threadName; public Work(String name) { threadName = name; } @Override public void run() { int max=(int) (20*Math.random()); for (int i = 0; i < max; i++) { try { sleep((long)(1000*Math.random())); System.out.print(threadName); } catch (InterruptedException e) { e.printStackTrace(); } } } }
Запускаем три потока с именами A, B и C:
public class ParalleLogic { public static void main(String[] args) { Work work1 = new Work("A"); Work work2 = new Work("B"); Work work3 = new Work("C"); work1.start(); work2.start(); work3.start(); } }
0 notes
Text
es (40 sloc) 1.44 KBRawBlameHistory package ru.samsung.itschool.threads; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { TextView text; Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView) findViewById(R.id.text1); handler = new Handler() { // создание хэндлера @Override public void handleMessage(Message msg) { super.handleMessage(msg); text.setText(text.getText().toString() + msg.what); text.invalidate(); } }; AnotherThread t = new AnotherThread();//создание потока t.start();//запуск потока } class AnotherThread extends Thread { @Override public void run() { for (int i = 0; i < 20; i++) { try { Thread.sleep(1000); //Приостанавливает поток на 1 секунду } catch (InterruptedException e) { } handler.sendEmptyMessage(1); // отправка сообщения хендлеру } } } }
0 notes