Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.example.tatyanakucheruk.myapplication_argb;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.graphics.Rect;
- import android.os.AsyncTask;
- import android.util.AttributeSet;
- import android.view.View;
- import android.widget.Toast;
- import java.util.concurrent.TimeUnit;
- public class DrawView extends View {
- private static final int MAX_COUNT = 6912; // всего пикселей (см описание mItemPic)
- private static int FADEOUT = 0;
- private static int FADEIN = 1;
- private Paint p;
- private Rect mRect; // для рисования прямоугольника
- private boolean viewFlg = true;
- // Любое изображение, которое мы загружаем из графического файла, является набором цветных точек (пикселей)
- // Информацию о каждой точке можно сохранить в битах
- // Отсюда и название - карта битов - bitmap
- private Bitmap bitmap;
- private int mOpacity = 255; // прозрачность, 255 непрозрачный
- private int mWidth; // ширина View;
- private int mHeight; // высота View;
- private int direct; // направление
- private int mItemPic = 0; // сколько обработать блоков
- //Класс DrawView является наследником View и переопределяет его метод onDraw. А этот метод дает нам доступ к объекту Canvas.
- public DrawView(Context context) {
- super(context);
- }
- // определяем битмап в конструкторе
- // андройд из файла 240x320 делает битмап в трое большего размера по пикселям
- public DrawView(Context context, AttributeSet attrs) { //конструктор
- super(context, attrs);
- p = new Paint();
- mOpacity = 255;
- mRect = new Rect(710,0,720,10); // для рисования прямоугольника - его координаты
- // фоновая картинка выводится на экран из файла
- Bitmap bitmap_original = BitmapFactory.decodeResource(getResources(), R.drawable.strawberry);
- // получаем картинку
- bitmap = Bitmap.createScaledBitmap(bitmap_original, 720, 960, false);
- // Canvas является инструментом для рисования. Весь результат сохраняется на Bitmap.
- // Мы не можем напрямую попросить Bitmap нарисовать на себе линию или круг,
- // поэтому Canvas выступает посредником и помогает нарисовать то, что нужно.
- }
- @Override
- protected void onDraw(Canvas canvas) { // Для рисования используется объект Canvas
- super.onDraw(canvas); // метод onDraw дает доступ к Canvas
- // размер view
- mWidth = canvas.getWidth();
- mHeight = canvas.getHeight();
- // фоновая заливка
- canvas.drawARGB(80,130,250,220);
- // настройка кисти
- // красный цвет (рамка у квадрата)
- p.setColor(Color.RED);
- canvas.drawBitmap(bitmap,0,0,p); // рисуем
- // покрывающий квадрат
- p.setStyle(Paint.Style.FILL); //Устанавливаем кисть в режим рисования методом «заливка»
- p.setARGB(mOpacity,0,128,0); // непрозрачный зеленый квадрат
- if (viewFlg) {
- fullFill(canvas); // полная закраска
- } else {
- fullOpacity(canvas,direct); // полностью непрозрачный
- }
- }
- // сплошная быстрая заливка
- private void fullFill(Canvas canvas) {
- for (int i = 1; i <= 96; i++) {
- for (int j = 72; j >= 1; j--) {
- canvas.drawRect(mRect,p); // выводим изображение
- canvas.translate(-10, 0); // осуществляется перемещение
- }
- canvas.translate(720, 10);
- }
- }
- // сплошная заливка со сдвигом
- private void fullOpacity(Canvas canvas,int direct) {
- int opacity = 0;
- if (direct == FADEIN) opacity = 255; // полностью закрашиваем (проверка)
- if (direct == FADEOUT) opacity = 0; // полностью не закрашиваем (проверка)
- int stopId = 0; // параметр останавливающий цикл
- for (int i = 1; i <= 96; i++) {
- for (int j = 72; j >= 1; j--) {
- p.setARGB(opacity, 0, 128, 0);
- canvas.drawRect(mRect,p); // выводим изображение
- canvas.translate(-10, 0); // осуществляется перемещение
- // если сдвиг больше чем обрабатываемый элемент
- // то в зависимости от направления остальные квадраты рисуем прозрачными или закрашеными
- if ((stopId > mItemPic) && (direct == FADEOUT)) {
- opacity = 255;
- }
- if ((stopId > mItemPic) && (direct == FADEIN)) {
- opacity = 0;
- }
- stopId++;
- }
- canvas.translate(720, 10); // осуществляется перемещение
- }
- }
- // непрозрачный
- public void setOpaque() {
- // ставим альфу в 255 - т.к. непрозрачный цвет
- mOpacity = 255;
- invalidate(); // аннулировать
- }
- // прозрачный
- public void setTransparent() {
- // ставим альфу в 0 - т.к. прозрачный цвет
- mOpacity = 0;
- invalidate(); // аннулировать
- }
- // делаем прозрачной
- public void setFadeOut() {
- viewFlg = false;
- direct = FADEOUT;
- mOpacity = 0;
- new MyTack(FADEOUT).execute();
- }
- // делаем непрозрачной
- public void setFadeIn() {
- viewFlg = false;
- direct = FADEIN;
- mOpacity = 255;
- new MyTack(FADEIN).execute();
- }
- // меняем картинку с помошью асинхронного потока
- class MyTack extends AsyncTask<Void,Void,Void> {
- private int direct; // направление изменения прозрачности
- // конструктор
- public MyTack(int direct){
- this.direct = direct;
- }
- @Override
- protected Void doInBackground(Void... voids) { //doInBackground() – основной метод, который выполняется в новом потоке
- while (mItemPic < MAX_COUNT){ // пока не будут закрашены все квадраты
- mItemPic++; // увеличивает
- try {
- TimeUnit.MICROSECONDS.sleep(3500); // время закрашивания
- } catch (InterruptedException e) {
- e.printStackTrace(); // проверка на ошибку
- }
- // publishProgress() - можно вызвать в doInBackground() для показа промежуточных результатов в onProgressUpdate()
- publishProgress();
- }
- return null;
- }
- @Override
- protected void onProgressUpdate(Void... values) {
- // обновляем view
- // вызываем обновление в основном потоке
- invalidate();
- }
- @Override
- protected void onPostExecute(Void aVoid) {
- Toast.makeText(getContext(),"Готово",Toast.LENGTH_SHORT).show();
- viewFlg = true;
- mItemPic = 0;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement