Ну и, как и было обещано- вот он- второй, более сложный вариант вывода рандомных точек на экран, тут уже не просто 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) - тут задается толщина линии, в нашем случае, размер точек, его тоже можно менять, так же заметно меняет вид 'снега'
1 год назад