Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.84
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
#1

Как рисовать на кнопках - Программирование Android

01.08.2013, 16:58. Просмотров 2643. Ответов 10
Метки нет (Все метки)

Есть кнопка на которой картинка и текст. Хочу картинку РИСОВАТЬ самому. Не сохраняя в файлы, а только для отображения - текст, линии, рамки, заливка....

Примеров по рисованию уйма, но мне нужно рисовать не на всем форме/активити, а только на маленьком кусочке (в крайнем случае на SurfaceView а не на кнопке).

Скиньте пожалуйста ПОЛНЫЙ пример подобной отрисовки - как создать сам класс-рисовалку на основе View понял. Примеров -куча:
Java
1
public class Draw2D extends View {...
Не понятно как отобразить его ТОЛЬКО на кнопке или SurfaceView.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2013, 16:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как рисовать на кнопках (Программирование Android):

Как рисовать графики на Android? - Программирование Android
Как рисовать графики на андроид?То есть,делаю калькулятор на андроид, нужно создать поле для ввода самой функции например y=x+3, после...

Как рисовать на готовом canvas? - Программирование Android
Друзья всем привет!! :) Недавно начал изучать canvas и всю эту тему и не могу разобраться как можно рисовать на готовом layout? ...

Как рисовать текст на Canvas во View? - Программирование Android
Есть ImageView. Я делаю так: Canvas canvas; canvas = new Canvas(); canvas.drawText("Текст", 0, 0, null); А потом уже: ...

Как рисовать сплошные линии независимости от скорости кисти - Программирование Android
Хочу сделать рисовалку на Android, но столкнулся с проблемкой - если рисовать медленно на канве, то получается более-менее цельная...

Масштабирование картинок, отрисованных на кнопках - Программирование Android
Здравствуйте. Есть кнопки с отрисовнными на них картинками android:drawableLeft="@drawable/icon_temp_btn_on_off", где...

Изменение цвета текста на кнопках-заголовках TabLayout - Программирование Android
Разметка у меня такая: <android.support.design.widget.TabLayout android:layout_width="match_parent" ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
01.08.2013, 17:10 #2
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class MyButton extends Button {
 
 
....
 
@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
// draw here, please pay attention on examples
    }
 
}
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
01.08.2013, 17:20  [ТС] #3
Запутали новичка...
Если я правильно понял, предлагаете создать свой класс с кнопкой и рисоваь в нем... Но как подключить эту кнопку в XML дизайн???

А без этого нельзя? А если хочу рисовать на SurfaceView? Вроде он специально для этого предназначен...
0
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
01.08.2013, 17:24 #4
если вам нужна именно кнопка с каким то кастомным изображением внутри - используйте кнопку.
если вам просто что то нарисовать надо - используейте сюрфейс.

в хмл вставить просто

XML
1
2
3
4
5
<com.tester64.megaapp.view.MyButton
 
                android:layout_height="match_parent"
                android:layout_width="match_parent"
/>
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
01.08.2013, 17:35  [ТС] #5
Кастомную кнопку успешно вставил - весь квадрат кнопки окрсился моим цветом и даже (нашел у китайцев) обрабатывает цветом нажатие. Но... мне не нужно было МЕНЯТЬ кнопку. Мне нужно было лишь заменить на вручную отрисовываемую картинку внутри кнопки над текстом в кнопке вида:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
         <Button
                android:id="@+id/Button_Rem"
                style="@style/BaseThemeButton_Yellow"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_marginLeft="3dp"
                android:layout_weight="5"
                android:drawablePadding="2sp"
                android:drawableTop="@drawable/my_pic"
                android:onClick="but_Click"
                android:paddingTop="15sp"
                android:text="Текст"
                android:textColor="#FFFF88"
                android:textSize="10sp"
                android:clickable="true"
                android:textStyle="bold"/>
То-есть вместо android:drawableTop="@drawable/my_pic" вставлять свой "временный" рисунок прямо из памяти. И принудительно его менять. Например нарисовать аналоговые часики и требовать нажать до истечения срока.

Кнопок может быть много и каждая со своим смыслом. Создавать по классу для каждой кнопки - сложно... проще сделать ЕДИНУЮ процедуру отрисовки с передаваемым внутрь парамером - кодом/номером/счетчиком кнопки.
0
Wenceslaus
Android Developer
130 / 130 / 4
Регистрация: 05.07.2013
Сообщений: 205
01.08.2013, 17:57 #6
Что мешает создать/нарисовать свой drawable программно, и установить его на кнопку?
Java
1
button.setCompoundDrawablesWithIntrinsicBounds(null, temp_drawable, null, null);
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
01.08.2013, 18:11  [ТС] #7
Цитата Сообщение от Wenceslaus Посмотреть сообщение
Что мешает создать/нарисовать свой drawable программно, и установить его на кнопку?
То в чем и заключается вопрос! ПОМОГИТЕ НОВИЧКУ! Не знаю с чего начать!!!!
Есть класс отрисовки на основе View (из примеров)... А дальше что с ним делать??? Как подключить к картинке на кнопке?
0
Wenceslaus
Android Developer
130 / 130 / 4
Регистрация: 05.07.2013
Сообщений: 205
01.08.2013, 18:19 #8
Если с самим классом проблем нет (создаётся, рисуется), то после рисование конвертните его в drawable:
Java
1
2
3
4
drawView.setDrawingCacheEnabled(true);
Bitmap bmp = Bitmap.createBitmap(drawView.getDrawingCache());
drawView.setDrawingCacheEnabled(false);
Drawable d = new BitmapDrawable(getResources(), bmp);
Если есть вопросы по работе с самим классом: класс в студию..
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
01.08.2013, 18:43  [ТС] #9
Как с вами всеми (гуру) тяжело общаться... Я - НОВИЧОК! Я же просил ПОЛНЫЙ ПРИМЕР! Как ВАШ КОД СКЛЕИТЬ ВМЕСТЕ???

Java
1
2
3
4
5
drawView.setDrawingCacheEnabled(true);
Bitmap bmp = Bitmap.createBitmap(drawView.getDrawingCache());
drawView.setDrawingCacheEnabled(false);
Drawable d = new BitmapDrawable(getResources(), bmp);
button.setCompoundDrawablesWithIntrinsicBounds(null, temp_drawable, null, null);
Где кнопка? Где вьюв? Как он создается? Какой параметр при содании вьюва - this или что-то другое? bmp это d?

Пример View (Draw2D) взял отсюда:
http://developer.alexanderklimov.ru/...implepaint.php
http://rusproject.narod.ru/android/simplepaint.htm
Теоретически рисует нормально... В крайнем случае все обнулю - пусть рисует белый лист. Но как его подключить...

Но как его приклеить к кнопке????
Java
1
2
3
4
5
6
7
8
9
10
public class SimplePaintActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Draw2D d = new Draw2D(this);
        setContentView(d);
        //setContentView(R.layout.main);
    }
}
Явно для кнопки не подходит!

В OnCreate
Java
1
2
3
4
5
6
7
           DrawRemRect drawView = new Draw2D(this);
 
            drawView.setDrawingCacheEnabled(true);
            Bitmap bmp = Bitmap.createBitmap(drawView.getDrawingCache());
            drawView.setDrawingCacheEnabled(false);
            Drawable d = new BitmapDrawable(getResources(), bmp);
((Button) findViewById(R.id.MyButton)).setCompoundDrawablesWithIntrinsicBounds(null, d, null, null);
Выдает ошибку компиляции....
0
Wenceslaus
Android Developer
130 / 130 / 4
Регистрация: 05.07.2013
Сообщений: 205
01.08.2013, 19:53 #10

Не по теме:

Дать полный пример для работы с классом Draw2D, когда вы предоставили его полный код в первом посте

Цитата Сообщение от Tester64 Посмотреть сообщение
public class Draw2D extends View {...
это за гранью наших, как вы выразились, гуру, возможностей.



Код рисования и установки изображения на кнопку:
Java
1
2
3
4
5
6
7
8
9
        Draw2D drawView = new Draw2D(this); //создание экземпляра класса Draw2D (this == ActivityName.this)
        
        int w = 500, h = 500; // установка ширины / высоты изображения
        Bitmap.Config conf = Bitmap.Config.ARGB_8888; // конфигурация
        Bitmap bmp = Bitmap.createBitmap(w, h, conf); // создание Bitmap
        Canvas canvas = new Canvas(bmp); // создание Canvas
        drawView.draw(canvas); // зарисовка Bitmap
        Drawable d = new BitmapDrawable(getResources(), bmp); // конвертируем из Bitmap в Drawable
        ((Button) findViewById(R.id.MyButton)).setCompoundDrawablesWithIntrinsicBounds(null, d, null, null); // устанавливаем Drawable кнопке
Код класса Draw2D (обратите внимание на строку 52)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    public class Draw2D extends View {
        public Draw2D(Context context) {
            super(context);
        }
 
        @Override
        protected void onDraw(Canvas c) {
            super.onDraw(c);
 
            Paint paint = new Paint();
            paint.setStyle(Paint.Style.FILL);
 
            // закрашиваем холст белым цветом
            paint.setColor(Color.WHITE);
            c.drawPaint(paint);
 
            // Рисуем желтый круг
            paint.setAntiAlias(true);
            paint.setColor(Color.YELLOW);
            c.drawCircle(450, 30, 25, paint);
 
            // Рисуем зеленый прямоугольник
            paint.setColor(Color.GREEN);
            c.drawRect(20, 200, 460, 230, paint);
 
            // Рисуем текст
            paint.setColor(Color.BLUE);
            paint.setStyle(Paint.Style.FILL);
            paint.setAntiAlias(true);
            paint.setTextSize(30);
            c.drawText("Лужайка для котов", 30, 200, paint);
 
            // Текст под углом
            int x = 310;
            int y = 190;
 
            paint.setColor(Color.GRAY);
            paint.setTextSize(25);
            String str2rotate = "Лучик солнца!";
 
            // Создаем ограничивающий прямоугольник для наклонного текста
            Rect rect = new Rect();
 
            // поворачиваем холст по центру текста
            c.rotate(-45, x + rect.exactCenterX(), y + rect.exactCenterY());
 
            // Рисуем текст
            paint.setStyle(Paint.Style.FILL);
            c.drawText(str2rotate, x, y, paint);
 
            // восстанавливаем холст
//          c.restore(); восстанавливать нечего, ибо мы ничего не сохраняли
 
            // Выводим значок из ресурсов
            Resources res = this.getResources();
            Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.icon);
            c.drawBitmap(bitmap, 415, 655, paint);
        }
    }
1
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
01.08.2013, 20:24  [ТС] #11
Спасибо! Заработало! Теперь буду менять код и понимать его! Знаю несколько языков, но понять яву+апи андрода по примерам очень тяжело...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2013, 20:24
Привет! Вот еще темы с ответами:

Как рисовать "карандашом" на экране - Программирование Android
Уважаемые мастера, подскажите, как сделать рисовалку - типа, пользователь водит пальцем по экрану, а за ним идет след - как будто он рисует...

Текст в 2 строки на кнопках(картинка в bg). Кнопки "ездят", портится их форма и тд - Программирование Android
Не знаю как решить проблему длинного текста на кнопках. У меня кнопка-картинка овальной формы. Если 1 строка - то все хорошо и красиво...

Рисовать поверх всего - Программирование Android
Есть ли возможность рисовать поверх всего экрана не вешая канвас на какую либо вьюшку? То есть есть кастомная кнопка, неизвестно где она...

Одновременно и рисовать и отслеживать координаты нажатия - Программирование Android
Доброго времени суток. Реализую игру на андроиде. Все рисование делаю через Canvas. Создал свой класс, и там преспокойно рисую ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.08.2013, 20:24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru