Advertisement
Guest User

Untitled

a guest
Apr 28th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 8.56 KB | None | 0 0
  1. package com.example.tatyanakucheruk.myapplication_argb;
  2.  
  3. import android.content.Context;
  4. import android.graphics.Bitmap;
  5. import android.graphics.BitmapFactory;
  6. import android.graphics.Canvas;
  7. import android.graphics.Color;
  8. import android.graphics.Paint;
  9. import android.graphics.Rect;
  10. import android.os.AsyncTask;
  11. import android.util.AttributeSet;
  12. import android.view.View;
  13. import android.widget.Toast;
  14.  
  15. import java.util.concurrent.TimeUnit;
  16.  
  17. public class DrawView extends View {
  18.     private static final int MAX_COUNT = 6912; // всего пикселей (см описание mItemPic)
  19.     private static int FADEOUT = 0;
  20.     private static int FADEIN = 1;
  21.  
  22.     private Paint p;
  23.     private Rect mRect; //  для рисования прямоугольника
  24.  
  25.     private boolean viewFlg = true;
  26.  
  27.     // Любое изображение, которое мы загружаем из графического файла, является набором цветных точек (пикселей)
  28.     // Информацию о каждой точке можно сохранить в битах
  29.     // Отсюда и название - карта битов - bitmap
  30.     private Bitmap bitmap;
  31.  
  32.     private int mOpacity = 255; // прозрачность, 255 непрозрачный
  33.  
  34.     private int mWidth; // ширина View;
  35.     private int mHeight; // высота View;
  36.  
  37.     private int direct; // направление
  38.     private int mItemPic = 0; // сколько обработать блоков
  39.  
  40.  
  41.     //Класс DrawView является наследником View и переопределяет его метод onDraw. А этот метод дает нам доступ к объекту Canvas.
  42.     public DrawView(Context context) {
  43.         super(context);
  44.     }
  45.  
  46.  
  47.     // определяем битмап в конструкторе
  48.     // андройд из файла 240x320 делает битмап в трое большего размера по пикселям
  49.     public DrawView(Context context, AttributeSet attrs) { //конструктор
  50.         super(context, attrs);
  51.         p = new Paint();
  52.  
  53.         mOpacity = 255;
  54.         mRect = new Rect(710,0,720,10); //  для рисования прямоугольника - его координаты
  55.         // фоновая картинка выводится на экран из файла
  56.         Bitmap bitmap_original = BitmapFactory.decodeResource(getResources(), R.drawable.strawberry);
  57.         // получаем картинку
  58.         bitmap = Bitmap.createScaledBitmap(bitmap_original, 720, 960, false);
  59.  
  60.         // Canvas является инструментом для рисования. Весь результат сохраняется на Bitmap.
  61.         // Мы не можем напрямую попросить Bitmap нарисовать на себе линию или круг,
  62.         // поэтому Canvas выступает посредником и помогает нарисовать то, что нужно.
  63.     }
  64.  
  65.     @Override
  66.     protected void onDraw(Canvas canvas) { // Для рисования используется объект Canvas
  67.         super.onDraw(canvas); // метод onDraw дает доступ к Canvas
  68.  
  69.         // размер view
  70.         mWidth = canvas.getWidth();
  71.         mHeight = canvas.getHeight();
  72.  
  73.         // фоновая заливка
  74.         canvas.drawARGB(80,130,250,220);
  75.         // настройка кисти
  76.         // красный цвет (рамка у квадрата)
  77.         p.setColor(Color.RED);
  78.         canvas.drawBitmap(bitmap,0,0,p); // рисуем
  79.  
  80.         // покрывающий квадрат
  81.         p.setStyle(Paint.Style.FILL); //Устанавливаем кисть в режим рисования методом «заливка»
  82.         p.setARGB(mOpacity,0,128,0); // непрозрачный зеленый квадрат
  83.         if (viewFlg) {
  84.             fullFill(canvas); // полная закраска
  85.         } else {
  86.             fullOpacity(canvas,direct); // полностью непрозрачный
  87.         }
  88.     }
  89.  
  90.  
  91.     // сплошная быстрая заливка
  92.     private void fullFill(Canvas canvas) {
  93.         for (int i = 1; i <= 96; i++) {
  94.             for (int j = 72; j >= 1; j--) {
  95.                 canvas.drawRect(mRect,p); // выводим изображение
  96.                 canvas.translate(-10, 0); // осуществляется перемещение
  97.             }
  98.             canvas.translate(720, 10);
  99.         }
  100.     }
  101.  
  102.  
  103.     // сплошная заливка со сдвигом
  104.     private void fullOpacity(Canvas canvas,int direct) {
  105.         int opacity = 0;
  106.         if (direct == FADEIN) opacity = 255; // полностью закрашиваем (проверка)
  107.         if (direct == FADEOUT) opacity = 0; // полностью не закрашиваем (проверка)
  108.  
  109.         int stopId = 0; // параметр останавливающий цикл
  110.         for (int i = 1; i <= 96; i++) {
  111.             for (int j = 72; j >= 1; j--) {
  112.                 p.setARGB(opacity, 0, 128, 0);
  113.                 canvas.drawRect(mRect,p); // выводим изображение
  114.                 canvas.translate(-10, 0); // осуществляется перемещение
  115.                 // если сдвиг больше чем обрабатываемый элемент
  116.                 // то в зависимости от направления остальные квадраты рисуем прозрачными или закрашеными
  117.                 if ((stopId > mItemPic) && (direct == FADEOUT)) {
  118.                     opacity = 255;
  119.                 }
  120.                 if ((stopId > mItemPic)  && (direct == FADEIN)) {
  121.                     opacity = 0;
  122.                 }
  123.  
  124.                 stopId++;
  125.             }
  126.             canvas.translate(720, 10); // осуществляется перемещение
  127.         }
  128.     }
  129.  
  130.  
  131.     // непрозрачный
  132.     public void setOpaque() {
  133.         // ставим альфу в 255 - т.к. непрозрачный цвет
  134.         mOpacity = 255;
  135.         invalidate(); // аннулировать
  136.     }
  137.  
  138.  
  139.     // прозрачный
  140.     public void setTransparent() {
  141.         // ставим альфу в 0 - т.к. прозрачный цвет
  142.         mOpacity = 0;
  143.         invalidate(); // аннулировать
  144.     }
  145.  
  146.  
  147.     // делаем прозрачной
  148.     public void setFadeOut() {
  149.         viewFlg = false;
  150.         direct = FADEOUT;
  151.         mOpacity = 0;
  152.         new MyTack(FADEOUT).execute();
  153.  
  154.     }
  155.  
  156.  
  157.     // делаем непрозрачной
  158.     public void setFadeIn() {
  159.         viewFlg = false;
  160.         direct = FADEIN;
  161.         mOpacity = 255;
  162.         new MyTack(FADEIN).execute();
  163.     }
  164.  
  165.  
  166.     // меняем картинку с помошью асинхронного потока
  167.     class MyTack extends AsyncTask<Void,Void,Void> {
  168.         private int direct; // направление изменения прозрачности
  169.         // конструктор
  170.         public MyTack(int direct){
  171.             this.direct = direct;
  172.         }
  173.  
  174.         @Override
  175.         protected Void doInBackground(Void... voids) { //doInBackground() – основной метод, который выполняется в новом потоке
  176.             while (mItemPic < MAX_COUNT){ // пока не будут закрашены все квадраты
  177.                 mItemPic++; // увеличивает
  178.                 try {
  179.                     TimeUnit.MICROSECONDS.sleep(3500); // время закрашивания
  180.                 } catch (InterruptedException e) {
  181.                     e.printStackTrace(); // проверка на ошибку
  182.                 }
  183.                 // publishProgress() - можно вызвать в doInBackground() для показа промежуточных результатов в onProgressUpdate()
  184.                 publishProgress();
  185.             }
  186.             return null;
  187.         }
  188.  
  189.         @Override
  190.         protected void onProgressUpdate(Void... values) {
  191.             // обновляем view
  192.             // вызываем обновление в основном потоке
  193.             invalidate();
  194.         }
  195.  
  196.         @Override
  197.         protected void onPostExecute(Void aVoid) {
  198.             Toast.makeText(getContext(),"Готово",Toast.LENGTH_SHORT).show();
  199.             viewFlg = true;
  200.             mItemPic = 0;
  201.         }
  202.     }
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement