Найти в Дзене
Ну и, как и было обещано- вот он- второй, более сложный вариант вывода рандомных точек на экран, тут уже не просто 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 год назад
Ну и, теперь немного файлов позаливаю, чтоб наглядней получилось. Первый представленный проект на JStudio - SnowViewCanvas Первый файл- это скриншот работы программы. Вторым хотел залить Java файл, но блин, нету такой возможности- размер или тип файлов не поддерживается, да ладно, сейчас текст программы тогда просто вставлю package ru.p0005canvasanimate2; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.os.Bundle; import android.view.View; 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 View{    private Random random;    public DrawView(Context context){    super(context);    }    @Override    protected void onDraw(Canvas canvas) {    this.random = new Random();    Paint p = new Paint();    canvas.drawColor(Color.BLACK);    int xscr=canvas.getWidth()  ;    int yscr=canvas.getHeight();    int schpics=0;    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);    }    // canvas.drawText("Программа завершена",10,100,p);    invalidate();    }   } } В package указано ru.p0005canvasanimate2, но вставляя текст в свои проекты там будет уже package вашего проекта и повторять буква в букву имя папки не обязательно- главное как я заметил- чтоб в имени была точка-разделитель, иначе APK собираться не будет. В общем- тут наглядно и простенько так- заполняем холст рандомными точками, визуальный эффект- как 'снег' на экране старого телевизора, когда сигнала нету. :-) Да, хотел еще прикрутить сюда Apk файл проекта, но не вышло, формат файла тут не поддерживается, ну да и ладно Да, а вот текст второго 'снега', более сложный вариант- с применением SurfaceView... Блин! Код того варианта сюда уже не влезает, ладно, ждите ответа в следующей серии, как говорится, сейчас его в следующем посту и опубликую
1 год назад
И вот, на данный момент решил воссоздать на Java программку- заполнение экрана цветными точками. На ассемблере- результат похож на отсутствие сигнала на старых телевизорах, так называемый снег. Программа наглядно демонстрирует быстродействие, однако с Java все оказалось куда сложнее! Да, разобрался- как создавать Canvas, как добавлять на него дополнительные элементы- точки, линии, круги, прямоугольники, даже разобрался с динамической перерисовкой (invalidate()), однако при таком подходе- по экрану скачет одна точка, каждый раз появляясь в новом месте и исчезая в прежнем. В общем- нашел так называемый path- в нем можно рисовать- почти как на канвасе, только как точку нарисовать в нем не нашел, пришлось рисовать круги. И, еще одно огорчение- с path-ем, он сохраняет черно-белую картинку, цвет задается от канваса при перерисовке: int rndR=new Random().nextInt(255); int rndG=new Random().nextInt(255); int rndB=new Random().nextInt(255); // p.setColor(Color.argb(200,rndR,rndG,rndB)); ... canvas.drawPath(path,p); Строка задания цвета закомментирована, но оставлена, долго искал- как задать RGB по значениям, а в результате получилась не куча цветных точек, а белые круги, постепенно заполняющие экран белым, а при раскомментировании задания цвета- та часть картинки- что не черная еще и начинает мерцать - на всю картинку лишь два цвета. Ну чтож, будем учиться и искать дальше. А пока вот, это недоразумение, но работающее- результат работы программы- маленькие белые круги- не очень быстро но таки заполняют 'экран белым. Ну... хоть динамика в картинке уже есть. И да, проект для проверки кода и работы программы можете назвать как угодно и package указать свою, однако, вместо первой строки тогда - там где package - свою package и укажите, иначе не заработает. package ru.animmyanimrnd; import android.app.Activity; import android.os.Bundle; import android.graphics.Canvas; import android.view.View; import android.content.Context; import android.graphics.Paint; import java.util.Random; import android.graphics.Color; import android.graphics.Path; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new DrawView(this)); } class DrawView extends View { Paint p; Path path; public DrawView(Context context){ super(context); p = new Paint(); path= new Path(); } @Override protected void onDraw(Canvas canvas){ // заливка канвы цветом //canvas.drawARGB(80, 102, 204, 255); p.setStrokeWidth(1); int xscr=canvas.getWidth() ; int yscr=canvas.getHeight(); int rndX=new Random().nextInt(xscr); int rndY=new Random().nextInt(yscr); int rndR=new Random().nextInt(255); int rndG=new Random().nextInt(255); int rndB=new Random().nextInt(255); // p.setColor(Color.argb(200,rndR,rndG,rndB)); // canvas.drawPoint(rndX, rndY, p); // canvas.drawPoint(100,100,p); path.addCircle(100,100, 10,Path.Direction.CW); path.addCircle(rndX,rndY, 10,Path.Direction.CW); path.close(); canvas.drawPath(path,p); p.setColor(Color.WHITE); invalidate(); } } }
1 год назад
В продолжение- освоил я стало быть - как по шаблону делать графическое приложение на андроиде, решил что то свое замутить, для практики так сказать, ну и, на коленке сперва через четыре Line рамку нарисовал, размер рамки само собой, подобрал путем изменения и проверки запуском, было что то вроде: p.setStrokeWidth(1); //p- ранее определено через p=newPaint(), а эта и следующая строки кода- задание толщины линии и цвет p.setColor(Color.GREEN); float wh=719; float hi=1330; canvas.drawLine(1,1,1,hi,p); canvas.drawLine(1,hi,wh,hi,p); canvas.drawLine(wh,1,1,1,p); Далее стал искать- как же это дело сократить, решил сделать через Rect(прямоугольник), однако по умолчанию он идет с заливкой, начал гуглить и нашел следующий вариант: p.setStyle(Paint.Style.STROKE); //отключает заливку canvas.drawRect(1,1,wh,hi,p); IDE переварила и собрала APK, все сработало выдав картинку, идентичную той что была с четырьмя Line, однако следующий вопрос- меня занявший- был- а как же узнать программно высоту и ширину холста, чтоб параметры прямоугольника плясали от этих величин, а не задавались путем подбора, Опять полез гуглить- нашел массу вариантов, которые в JStudio не запускались- типа этого: Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; Однако не сдавался и наконец таки нашел более простой вариант: int xscr=canvas.getWidth();//ширина экрана int yscr=canvas.getHeight();//высота экрана p.setStyle(Paint.Style.STROKE); canvas.drawRect(1,1,xscr,yscr,p); Да, в последствии- чтоб рамку было лучше видно сверху и снизу переписал последнюю строчку так, чтоб сверху и снизу были отступы в три пикселя: canvas.drawRect(1,3,xscr,yscr-3,p); Ну, на сегодня все пожалуй, до следующих встреч дорогие читатели.
1 год назад
И так... Путь к Java у меня уже долог, однако, прежние попытки его освоить потерпели фиаско. Ранние попытки были еще на кнопочных телефонах (смартфон тех лет- Nokia e63 с симбианом 9.2 и qwerty клавиатурой) - тогда помню- отдельно компилятор джавы, верификатор и компоновщик были, такая муть- скажу я вам! Тогда- сколько я не изучал это ООП, сколько не экспериментировал- больше чем хелло ворд у меня не шло. Еще попытки были- на компьютере- установил кучу всего для программирования в Java, IDE какие то- в колличестве пяти штук- редакторы кода, так же- несколько, и, в конечном итоге- сошло все на нет, запутался в нем и забросил. Теперь вот- нашел в гуглплее JStudio ide, скажу я вам- даже бесплатная версия многое может- и разработка приложений происходит прямо на андроид смартфоне!!! В общем, сперва консольные приложения в виде java class по всевозможным бесплатным интернет учебникам изучал и запускал параллельно читая  учебник по Java- "JAVA - библиотека профессионала. Том 1. ОСНОВЫ" одиннадцатое издание Кей Хорстманн, собственно этот учебник выпал в поиске гугла по запросу "Java учебник топ 10 на русском". Ну и вроде все хорошо, изучал себе, почти до четвертой главы этого учебника дошел. Ну- вроде как почти все понятно- пока читаешь, а в голове вся эта муть не откладывается! А потом решил перейти к рисованию, к графической части, поскольку консоль консолью, но хочется большего! И, какого же было мое удивление- что в JStudio в Java практически эту самую графику и не создать, или может быть как то ее создать можно- но я плохо искал, однако примеры по Java рисованию не пошли. Далее опять же гугл поиск- как организовать рисование в андроид проекте (есть такой пункт в jStudio), нагуглил, создал андроид проект, а при попытке запуска сгенерированного шаблона (хелло ворд) IDE выдал- мол пакет собрать не получилось, ну думаю- "ВСЁ ПРОПАЛО!" Однако- оказалось - все дело в вводимом значении поля Package - при создании нового проекта, оказывается- его отнють не от балды и не абы как формировать надо, а с учетом имени проекта, в общем- на данный момент- запустил в JStudio проект из учебника по компьютерной среде разработки A-Studio и он у меня благополучно скомптлировался, собрался и установился- пропущенный через JStudio. Вот текст этого учебного проекта: Создадим проект: Project name: P1411_CanvasView Build Target: Android 2.3.3 Application name: CanvasView Package name: ru.startandroid.develop.p1411canvasview Create Activity: MainActivity - п.с. в JStudio я позаимствовал только имя проекта, AppName- как в jstudio он обозван и эту- Package -из за которой по началу у меня даже сгенерированный при создании нового проекта примеры не запускались Код MainActivity.java: package ru.startandroid.develop.p1411canvasview; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity {   @Override   protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(new DrawView(this));   }   class DrawView extends View {    public DrawView(Context context) {    super(context);    }    @Override    protected void onDraw(Canvas canvas) {    canvas.drawColor(Color.GREEN);    }   } } Ну- код программы я передрал один в один и все заработало. Так что теперь надо разобраться будет еще с той мутью что не доусвоил в консольных примерах- как то пакетирование, наследование, суперклассы и т.д. и т.п. в общем- и уже можно писать свои программы с отображеньем на Canvas-е :-) В общем, думаю- на этот раз у меня все таки получится постичь этот Java и начать уже на нем писать, понятно, что ООП это вам не процедурный язык, что тут мышление надо менять как то, тут немного другие принципы программирования! В общем- надеюсь на лучшее, что все получится!
1 год назад