Найти в Дзене

Ну и, как и было обещано- вот он- второй, более сложный вариант вывода рандомных точек на экран, тут уже не просто Canvas, а с применением SurfaceView


package ru.p0006viewsnowanim2;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.graphics.Paint;
import java.util.Random;

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(new DrawView(this));
  }

  class DrawView extends SurfaceView implements SurfaceHolder.Callback {
   Paint p;
   private DrawThread drawThread;

   public DrawView(Context context) {
   super(context);
   p = new Paint();
   getHolder().addCallback(this);
   }

   @Override
   public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {
   }

   @Override
   public void surfaceCreated(SurfaceHolder holder) {
   drawThread = new DrawThread(getHolder());
   drawThread.setRunning(true);
   drawThread.start();
   }

   @Override
   public void surfaceDestroyed(SurfaceHolder holder) {
   boolean retry = true;
   drawThread.setRunning(false);
   while (retry) {
   try {
   drawThread.join();
   retry = false;
   } catch (InterruptedException e) {
   }
   }
   }

   class DrawThread extends Thread {
   private Random random;
   private boolean running = false;
   private SurfaceHolder surfaceHolder;

   public DrawThread(SurfaceHolder surfaceHolder) {
   this.surfaceHolder = surfaceHolder;
   }

   public void setRunning(boolean running) {
   this.random = new Random();
   this.running = running;
   }

   @Override
   public void run() {
   Canvas canvas;
   while (running) {
   canvas = null;
   try {
   canvas = surfaceHolder.lockCanvas(null);
   if (canvas == null)
   continue;

   //здесь происходит рисование
   int xscr=canvas.getWidth()  ;
   int yscr=canvas.getHeight();

   int schpics=0;
   canvas.drawARGB(80, 102, 204, 255);
   p.setColor(Color.BLACK);
   // толщина линии
   p.setStrokeWidth(7);

   while(schpics<=50000){
   schpics++;
   p.setColor(Color.rgb(
   random.nextInt(255),
   random.nextInt(255),
   random.nextInt(255)
   ));
   canvas.drawPoint(
   random.nextInt(xscr),
   random.nextInt(yscr), p);
   }
   } finally {
   if (canvas != null) {
   surfaceHolder.unlockCanvasAndPost(canvas);
   }
   }
   }
   }
  }
 }
}

Да уж! Хотел и сюда картинку скриншота работы установленной программы залить, однако, даже на картинку ругается- размер или формат не поддерживается - говорит, ну да ладно- этот 'снег' - он не многим отличается от предыдущего.
Да, об особенностях программы- как можно увидеть в коде: while(schpics<=50000) - в этом цикле отрисовываются по многу точек за один проход, поскольку в отличии от процедурных языков - по точке за проход выводить тут не получится, верней- можно за морочиться- но надо будет так же отложенную отрисовку прикрутить по таймеру чтоб, а тут просто простенький пример работоспособного кода. То есть- за мгновение она заносит на холст практически полсотни рандомных точек, потом отрисовывает, и отрисовка- это более времязатратный момент для программы. Да, количество добавляемых точек можно менять, анимация при этом тоже заметно меняется, так же в коде можно найти -  p.setStrokeWidth(7) - тут задается толщина линии, в нашем случае, размер точек, его тоже можно менять, так же заметно меняет вид 'снега'
2 минуты