Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 18 окт 2017, 14:13

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: 24 фев 2014, 05:00 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1348
Благодарил (а): 0 раз.
Поблагодарили: 72 раз.

В этом уроке:


- используем Matrix для геометрических преобразований фигур




Click here to read this article!

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Последний раз редактировалось damager82 29 май 2017, 23:20, всего редактировалось 3 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 24 фев 2014, 22:58 

Зарегистрирован: 15 фев 2014, 23:21
Сообщений: 3
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Спасибо за урок! Вопрос появился: в setContentView мы ставим view, а не layout-файл, как в этом случае добавлять кнопки и т.д. или самим рисовать и в обработчике касания проверять когда нажимаешь? Еще не получается перейти в другой активити из-за того, что класс, который рисует фигуры наследует View, а не Activity, что можно сделать?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 25 фев 2014, 20:37 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1348
Благодарил (а): 0 раз.
Поблагодарили: 72 раз.
Вы можете использовать этот DrawView в своем layout-файле, как обычный View.

Для этого вынесите его из Activity в отдельный класс DrawView.
Конструктор надо будет добавить:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public class DrawView extends View {
  2.  
  3.         public DrawView(Context context) {
  4.                 this(context, null);
  5.         }
  6.  
  7.         public DrawView(Context context, AttributeSet attrs) {
  8.                 super(context, attrs);
  9.         }
  10.        
  11.         @Override
  12.         protected void onDraw(Canvas canvas) {
  13.                 super.onDraw(canvas);
  14.                 canvas.drawColor(Color.GREEN);
  15.         }
  16.        
  17. }


А в layout пропишите так:
Код: [ Загрузить ] [ Скрыть ]
Using XML Syntax Highlighting
  1.     <ru.startandroid.develop.p1431drawingpath.DrawView
  2.        android:layout_width="300dp"
  3.        android:layout_height="200dp" />


Ну и хелп посмотрите на эту тему
http://developer.android.com/training/custom-views/index.html

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 25 фев 2014, 20:38 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1348
Благодарил (а): 0 раз.
Поблагодарили: 72 раз.
А чтобы вызывать другое Activity вам достаточно Context, который в конструкторе приходит.
Метод startActivity у него есть.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 апр 2014, 11:56 

Зарегистрирован: 04 апр 2014, 11:22
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Выделил DraView в отдельный файл. добавил его в разметку, но при обращении к нему по findViewById получаю ошибку.
Помогите пожалуйста понять в чем ошибка. (в строке myDraw.clearPath();) ошибка NullPointerException - то есть получается что findViewById возвращает NULL

Код: [ Загрузить ] [ Скрыть ]
  1. public class MainActivity extends Activity { 
  2.     DrawView myDraw; 
  3.     Button myButton; 
  4.  
  5.     @Override 
  6.     protected void onCreate(Bundle savedInstanceState) { 
  7.  
  8.         super.onCreate(savedInstanceState); 
  9.         setContentView(R.layout.activity_main); 
  10.  
  11.         myButton = (Button)findViewById(R.id.button); 
  12.         myButton.setText("myButton"); 
  13.  
  14.     } 
  15.     public void onClickButton(View v) 
  16.     { 
  17.         myDraw=new DrawView(this); 
  18.         myDraw= (DrawView)findViewById(R.id.thisDrawView); 
  19.         myDraw.clearPath(); 
  20.     } 


activity_main.xml
Код: [ Загрузить ] [ Скрыть ]
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     xmlns:tools="http://schemas.android.com/tools" 
  3.     android:layout_width="match_parent" 
  4.     android:layout_height="match_parent" 
  5.     android:paddingLeft="@dimen/activity_horizontal_margin" 
  6.     android:paddingRight="@dimen/activity_horizontal_margin" 
  7.     android:paddingTop="@dimen/activity_vertical_margin" 
  8.     android:paddingBottom="@dimen/activity_vertical_margin" 
  9.     tools:context="ru.startandroid.develop.p1411canvasview.MainActivity"> 
  10.  
  11.     <TextView 
  12.         android:text="@string/hello_world" 
  13.         android:layout_width="wrap_content" 
  14.         android:layout_height="wrap_content" 
  15.         android:id="@+id/textView" /> 
  16.  
  17.     <ru.startandroid.develop.p1411canvasview.DrawView 
  18.         android:layout_width="300dp" 
  19.         android:layout_height="200dp" 
  20.         android:id="@+id/thisDrawView" 
  21.         android:layout_centerVertical="true" 
  22.         android:layout_centerHorizontal="true" /> 
  23.  
  24.     <Button 
  25.         android:layout_width="wrap_content" 
  26.         android:layout_height="wrap_content" 
  27.         android:text="New Button" 
  28.         android:id="@+id/button" 
  29.         android:layout_alignParentBottom="true" 
  30.         android:layout_centerHorizontal="true" 
  31.         android:onClick="onClickButton"/> 
  32.  
  33. </RelativeLayout> 



DrawView
Код: [ Загрузить ] [ Скрыть ]
  1. class DrawView extends View { 
  2.         public DrawView(Context context,AttributeSet attrs) 
  3.         { 
  4.             this(context); 
  5.         } 
  6.  
  7.         Paint p; 
  8.         Path path; 
  9.         Point point1; 
  10.         Point point21; 
  11.         Point point22; 
  12.  
  13.  
  14.         public DrawView(Context context) { 
  15.             super(context); 
  16.             p = new Paint(Paint.ANTI_ALIAS_FLAG); 
  17.             p.setStrokeWidth(3); 
  18.             path = new Path(); 
  19.             point1 = new Point(200,300); 
  20.             point21 = new Point(500,600); 
  21.             point22 = new Point(900,200); 
  22.             path.reset(); 
  23.             path.moveTo(100,100); 
  24.         } 
  25.         //переменные для координат 
  26.         float x = 0; 
  27.         float y = 0; 
  28.         //прямо в классе DrawView реализуем метод onTouchEvent() без присвоения OnTouchListener, 
  29.         //затем вызываем invalidate(), который, в сою очередь,     вызовет onDraw() 
  30.         @Override 
  31.         public boolean onTouchEvent(MotionEvent event) { 
  32.             if(event.getAction() == MotionEvent.ACTION_DOWN){ 
  33.                 x = event.getX(); 
  34.                 y = event.getY(); 
  35.                 //point1.x= (int) x; 
  36.                 //point1.y=(int) y; 
  37.                 path.lineTo(x,y); 
  38.                 invalidate(); 
  39.                 Log.d("LOGTAG", "x=" + x + " y=" + y); 
  40.             } 
  41.             return true; 
  42.         } 
  43.         public void clearPath() 
  44.         { 
  45.             Log.d("LOGTAG", "Clearpath"); 
  46.             path.reset(); 
  47.             path.moveTo(100,100); 
  48.             path.lineTo(150,150); 
  49.             invalidate(); 
  50.         } 
  51.       @Override 
  52.         protected void onDraw(Canvas canvas) { 
  53.             canvas.drawARGB(80, 102, 204, 255); 
  54.             // точка отклонения для первой линии 
  55.             p.setStyle(Paint.Style.STROKE); 
  56.             p.setColor(Color.RED); 
  57.             canvas.drawPath(path,p); 
  58.         } 
  59.     } 


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 апр 2014, 23:14 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1348
Благодарил (а): 0 раз.
Поблагодарили: 72 раз.
sheyninvlad писал(а):
Выделил DraView в отдельный файл. добавил его в разметку, но при обращении к нему по findViewById получаю ошибку.
Помогите пожалуйста понять в чем ошибка. (в строке myDraw.clearPath();) ошибка NullPointerException - то есть получается что findViewById возвращает NULL

Я немного неверно описал конструкторы. Исправил свое предыдущее сообщение, теперь должно работать.
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.         public DrawView(Context context) {
  2.                 this(context, null);
  3.         }
  4.  
  5.         public DrawView(Context context, AttributeSet attrs) {
  6.                 super(context, attrs);
  7.         }

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 окт 2015, 18:42 

Зарегистрирован: 18 дек 2014, 12:45
Сообщений: 8
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
API 16, AndroidStudio
Скопировал весь листинг в студию:
Код: [ Загрузить ] [ Скрыть ]
  1. package ru.startandroid.develop.p1441matrixtransform; 
  2.  
  3. import android.app.Activity; 
  4. import android.content.Context; 
  5. import android.graphics.Canvas; 
  6. import android.graphics.Color; 
  7. import android.graphics.Matrix; 
  8. import android.graphics.Paint; 
  9. import android.graphics.Path; 
  10. import android.os.Bundle; 
  11. import android.view.View; 
  12.  
  13. public class MainActivity extends Activity { 
  14.  
  15.   @Override 
  16.   protected void onCreate(Bundle savedInstanceState) { 
  17.     super.onCreate(savedInstanceState); 
  18.     setContentView(new DrawView(this)); 
  19.   } 
  20.  
  21.   class DrawView extends View { 
  22.  
  23.     Paint p; 
  24.     Path path; 
  25.     Matrix matrix; 
  26.  
  27.     public DrawView(Context context) { 
  28.       super(context); 
  29.       p = new Paint(); 
  30.       p.setStrokeWidth(3); 
  31.       p.setStyle(Paint.Style.STROKE); 
  32.  
  33.       path = new Path(); 
  34.       matrix = new Matrix(); 
  35.     } 
  36.  
  37.     @Override 
  38.     protected void onDraw(Canvas canvas) { 
  39.       canvas.drawARGB(80, 102, 204, 255); 
  40.  
  41.       // создаем крест в path 
  42.       path.reset(); 
  43.       path.addRect(300, 150, 450, 200, Path.Direction.CW); 
  44.       path.addRect(350, 100, 400, 250, Path.Direction.CW); 
  45.  
  46.       // рисуем path зеленым 
  47.       p.setColor(Color.GREEN); 
  48.       canvas.drawPath(path, p); 
  49.  
  50.       // настраиваем матрицу на перемещение на 300 вправо и 200 вниз 
  51.       matrix.reset(); 
  52.       matrix.setTranslate(300, 200); 
  53.        
  54.       // применяем матрицу к path 
  55.       path.transform(matrix); 
  56.  
  57.       // рисуем path синим 
  58.       p.setColor(Color.BLUE); 
  59.       canvas.drawPath(path, p); 
  60.  
  61.     } 
  62.  
  63.   } 
  64.  

, запустил, один квадрат перекрывает второй, то есть не хватает две полосы, нет как бы прозрачности.
Так же почему то не срабатывает трансформация:
Код: [ Загрузить ] [ Скрыть ]
  1. // настраиваем матрицу на перемещение на 300 вправо и 200 вниз 
  2.       matrix.reset(); 
  3.       matrix.setTranslate(300, 200); 
  4.        
  5.       // применяем матрицу к path 
  6.       path.transform(matrix); 


Фигура зелёного цвета закрашивается синим цветом и всё.

В чём может быть ошибка, если листинг полностью копирую без изменений.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 мар 2016, 11:06 

Зарегистрирован: 09 мар 2016, 15:59
Сообщений: 3
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
На версии 4.1 (API 16), удалось получить правильный результат только так.
Код: [ Загрузить ] [ Скрыть ]
  1.         @Override 
  2.         protected void onDraw(Canvas canvas) { 
  3.             canvas.drawARGB(80, 102, 204, 255); 
  4.  
  5.             // создаем крест в path 
  6.             path.reset(); 
  7.             path.addRect(300, 150, 450, 200, Path.Direction.CW); 
  8.             path.addRect(350, 100, 400, 250, Path.Direction.CW); 
  9.             path.close(); 
  10.  
  11.             // рисуем path зеленым 
  12.             p.setColor(Color.GREEN); 
  13.             canvas.drawPath(path, p); 
  14.  
  15.             // настраиваем матрицу на перемещение на 300 вправо и 200 вниз 
  16.             matrix.reset(); 
  17.             matrix.setTranslate(300, 200); 
  18.  
  19.             // применяем матрицу к path 
  20.             path.transform(matrix, pathDst); 
  21.             pathDst.close(); 
  22.  
  23.             // рисуем path синим 
  24.             p.setColor(Color.BLUE); 
  25.             canvas.drawPath(pathDst, p); 
  26.         } 

Т.е., во-первых, перед выводом на канву path надо закрывать (path.close()). Во-вторых, нужно использовать вариант метода path.transform с двумя параметрами, используя для результата другой экземпляр path (pathDst в коде выше). В третьих, после применения матрицы path нужно тоже закрывать (pathDst.close()). Иначе трансформация не работает почему-то, и крест выводится криво (как будто нет прозрачности, как указали выше).


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 мар 2016, 16:00 

Зарегистрирован: 20 фев 2016, 11:54
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
У меня также один зеленый прямоугольник перекрывал другой (в эмуляторе версия 5.1.0). Погуглил и понял, что это как-то связано с включением по умолчанию аппаратного ускорения, начиная с версии Android 3.0 (API level 11). Если в конструкторе DrawView выключить аппаратное ускорение, вставив строку this.setLayerType(View.LAYER_TYPE_SOFTWARE, null), то всё отображается корректно.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB