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

Создать свой "контрол" наследник Button - Android

Восстановить пароль Регистрация
 
ILNAR_93
Android
212 / 212 / 21
Регистрация: 19.01.2013
Сообщений: 1,516
Записей в блоге: 2
23.10.2016, 21:40     Создать свой "контрол" наследник Button #1
Необходимо создать control.



У этого control задний фон должен быть таким

XML
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="30dp"/>
    <stroke android:width="4dp"  android:color="@color/design_text_bg_color"/>
<solid android:color="@color/design_button_bg_color"/>
</shape>

И при добавлении контрола в лаяут
как передать параметры color для solid и stroke, а так-же width для stroke

XML
1
2
3
4
5
6
7
8
  <....control
                android:text="текст"
                android:layout_width="match_parent"
                android:id="@+id/Button"
                android:background="@drawable/design_button_bg"
                android:layout_marginBottom="5dp"
                android:layout_height="40dp"
                android:textColor="@color/white" />

Помогите пжлста кодом или ссылкой на разжёванный материал.
Спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
не спать!
1786 / 1520 / 472
Регистрация: 12.05.2014
Сообщений: 5,552
Завершенные тесты: 1
24.10.2016, 10:40     Создать свой "контрол" наследник Button #2
по-простому - никак

по-сложному
1. написать свою вьюшку, педварительно создать для нее Styleable атрибуты, потом в конструкторе вьюшки разбирать прилетающий массив атрибутов и создавать шейп программно

2. просто создать шейп программно с нужными параметрами и назначить его на фон контрола

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

ну и вынести все числа в dimens.xml
ILNAR_93
Android
212 / 212 / 21
Регистрация: 19.01.2013
Сообщений: 1,516
Записей в блоге: 2
24.10.2016, 10:42  [ТС]     Создать свой "контрол" наследник Button #3
Цитата Сообщение от Паблито Посмотреть сообщение
в чем прикол задавать отдельно размеры?
а так-же width для stroke - В некоторых местах толщина 0dpт.е. его не должно быть видно
Паблито
не спать!
1786 / 1520 / 472
Регистрация: 12.05.2014
Сообщений: 5,552
Завершенные тесты: 1
24.10.2016, 10:44     Создать свой "контрол" наследник Button #4
разные контролы - разные xml файлы с разными параметрами
ILNAR_93
Android
212 / 212 / 21
Регистрация: 19.01.2013
Сообщений: 1,516
Записей в блоге: 2
24.10.2016, 10:46  [ТС]     Создать свой "контрол" наследник Button #5
Паблито, не хотелось только из-за этого несколько контролов писать тем более не зная как пишется контрол )
Паблито
не спать!
1786 / 1520 / 472
Регистрация: 12.05.2014
Сообщений: 5,552
Завершенные тесты: 1
24.10.2016, 10:48     Создать свой "контрол" наследник Button #6
я до сих пор не понимаю в чем суть задачи
ILNAR_93
Android
212 / 212 / 21
Регистрация: 19.01.2013
Сообщений: 1,516
Записей в блоге: 2
24.10.2016, 10:53  [ТС]     Создать свой "контрол" наследник Button #7
Паблито,

Должна быть кнопка с фоном

Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="30dp"/>
    <stroke android:width="4dp"  android:color="@color/design_text_bg_color"/>
<solid android:color="@color/design_button_bg_color"/>
</shape>



И возможность смены цвета фона (solid ) и размера бордера(stroke - например в окошке авторизации кнопка с бордером, а в окошке профиля без).
Паблито
не спать!
1786 / 1520 / 472
Регистрация: 12.05.2014
Сообщений: 5,552
Завершенные тесты: 1
24.10.2016, 11:02     Создать свой "контрол" наследник Button #8
а почему просто не применять фон там где надо? и не применять там, где он не нужен?
хотя я об этом и говорил выше - разные контролы - разные файлы с фоном, мне кажется проще некуда
ILNAR_93
Android
212 / 212 / 21
Регистрация: 19.01.2013
Сообщений: 1,516
Записей в блоге: 2
24.10.2016, 13:09  [ТС]     Создать свой "контрол" наследник Button #9
Цитата Сообщение от Паблито Посмотреть сообщение
разные контролы - разные файлы с фоном, мне кажется проще некуда
Можно и так.

Если есть возможность сделать как я думаю, будет как то все в одном. Из-за этого хотелось так

Добавлено через 2 часа 1 минуту
Я сделал следующее:

1) Файл layout design_button.xml
XML
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/design_button"
        android:background="@drawable/design_button_bg"/>
 
</merge>
2) drawable design_button_bg.xml
XML
1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="30dp"/>
<solid android:color="@color/design_button_bg_color"/>
</shape>
3) Контроллер
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class designButton extends LinearLayout {
    private View mView;
    private int backgroundColor;
 
    public designButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.designButton);
        try {
            backgroundColor = a.getColor(R.styleable.designButton_backgroundColor, MyApplication.getInstance().getColorCompat(R.color.design_button_bg_color));
        } finally {
            a.recycle();
        }
 
        LayoutInflater inflater;
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mView = inflater.inflate(R.layout.design_button, this);
 
        mView.findViewById(R.id.design_button).setBackgroundColor(backgroundColor);
 
    }
}
attrs.xml
XML
1
2
3
4
   <declare-styleable name="designButton">
        <attr name="backgroundColor" format="color" value="#00aff0"/>
 
    </declare-styleable>



Вот так я вставляю кнопку

XML
1
2
3
4
5
<....designButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="sdsds"
            app:backgroundColor="@color/white"/>
Я правильно вообще делаю?

Как мне применить app:backgroundColor="@color/white" для пункт 2 элемент solid
Паблито
не спать!
1786 / 1520 / 472
Регистрация: 12.05.2014
Сообщений: 5,552
Завершенные тесты: 1
24.10.2016, 15:21     Создать свой "контрол" наследник Button #10
все приходится делать самому
XML
1
2
3
4
5
6
7
8
9
10
    <company.testproject.AwesomeButton
        style="@style/Base.Widget.AppCompat.Button.Borderless"
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="OLOLO"
        app:cornerRadius="8dp"
        app:strokeColor="#77FF77"
        app:strokeWidth="2dp" />
XML
1
2
3
4
5
    <declare-styleable name="designButton">
        <attr name="strokeColor" format="color" />
        <attr name="strokeWidth" format="dimension" />
        <attr name="cornerRadius" format="dimension" />
    </declare-styleable>
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.util.AttributeSet;
import android.widget.Button;
 
public class AwesomeButton extends Button {
 
    public AwesomeButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.designButton);
        final int strokeColor = a.getColor(R.styleable.designButton_strokeColor, Color.BLACK); // по дефолту типа черный
        final int strokeWidth = a.getDimensionPixelSize(R.styleable.designButton_strokeWidth, 4); // по дефолту, от балды 4 пикселя
        final int cornerRadius = a.getDimensionPixelSize(R.styleable.designButton_cornerRadius, 16);
        a.recycle();
        final GradientDrawable gd = new GradientDrawable();
        gd.setCornerRadius(cornerRadius);
        gd.setStroke(strokeWidth, strokeColor);
        setBackground(gd);
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2016, 15:44     Создать свой "контрол" наследник Button
Еще ссылки по теме:

Android Выбор платформы разработки "1С Мобильная платформа" или "Android Studio"
Android Создать свой "контрол"
Постепенно вывести на экран слово "Java", в котором буквы состоят из "интересных" элементов Android

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

Или воспользуйтесь поиском по форуму:
ILNAR_93
Android
212 / 212 / 21
Регистрация: 19.01.2013
Сообщений: 1,516
Записей в блоге: 2
24.10.2016, 15:44  [ТС]     Создать свой "контрол" наследник Button #11
Цитата Сообщение от Паблито Посмотреть сообщение
все приходится делать самому
спасибо
А вот так получилось у меня
Кликните здесь для просмотра всего текста
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
public class designButton extends Button {
    private View mView;
    private int backgroundColor;
    private HelperClass helperClass;
 
    public designButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        helperClass = new HelperClass(context);
        // TODO Auto-generated constructor stub
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.designButton);
        if (a!=null) {
            try {
                backgroundColor = a.getColor(R.styleable.designButton_backgroundColor, MyApplication.getInstance().getColorCompat(R.color.design_button_bg_color));
            } finally {
                a.recycle();
            }
        }
 
 
        GradientDrawable gdDefault = new GradientDrawable();
        gdDefault.setColor(backgroundColor);
        gdDefault.setCornerRadius(helperClass.intToDp(60));
        gdDefault.setStroke(helperClass.intToDp(0), getResources().getColor(R.color.colorAccent));
 
        if (Build.VERSION.SDK_INT >= 16) {
            designButton.this.setBackground(gdDefault);
        } else {
            designButton.this.setBackgroundDrawable(gdDefault);
        }
 
    }
}


Добавлено через 1 минуту
Java
1
2
3
4
5
6
7
8
public int intToDp(int inttodipvar)
        {
            float fontScale = ctx.getApplicationContext().getResources().getConfiguration().fontScale;
            float SCALE = ctx.getApplicationContext().getResources().getDisplayMetrics().density * fontScale;
 
            float temp = inttodipvar * SCALE;
            return Math.round(temp);
        }
Добавлено через 2 минуты
Сейчас посмотрю твой вариант и буду использовать его . Спасибо.

Добавлено через 1 минуту
getDimensionPixelSize получается родной метод android`а который выполняет те же функции как и intToDp?
Yandex
Объявления
24.10.2016, 15:44     Создать свой "контрол" наследник Button
Ответ Создать тему
Опции темы

Текущее время: 00:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru