Две строки разным размером шрифта на одной кнопке

Интерфейс, диалоги, темы, стили, меню
Ответить
Yusyuriv
Сообщения: 12
Зарегистрирован: 14 май 2012, 08:30

Две строки разным размером шрифта на одной кнопке

Сообщение Yusyuriv » 24 май 2012, 12:00

Можно ли как-то реализовать?

Upd: Сделал так, но как можно заставить TextView менять цвет текста в зависимости от того, находится ли LinearLayout в состоянии state_pressed или нет?

Код: Выделить всё

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="5dp"
    style="@android:style/Widget.Button"
    android:background="@drawable/signup_background_states">
    <TextView
        android:id="@+id/authSignupText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/auth_register"
        android:textColor="@color/signup_button_text_colors"
        android:textSize="@dimen/auth_register"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/authSignupSubtext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/auth_register_subtext"
        android:textColor="@color/signup_button_subtext_colors"
        android:layout_marginTop="10dp"
        android:gravity="center" />
</LinearLayout>
Последний раз редактировалось Yusyuriv 24 май 2012, 13:03, всего редактировалось 1 раз.

Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Re: Две строки разным размером шрифта на одной кнопке

Сообщение andev » 26 май 2012, 16:29

Возможно, не правильно вас понял, но если вам нужно менять цвет только в момент нажатия (т.е. это button, а не переключатель), можно попробовать сделать так:

Код: Выделить всё

        <LinearLayout
            android:id="@+id/ll_button"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:padding="5dp"
	    android:orientation="vertical"
	    android:gravity="center"
	    style="@android:style/Widget.Button" >
	    
	    <TextView
	    	android:id="@+id/tv_text"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="Text"
	        android:textColor="@color/black"
	        android:textSize="16dp"
	        android:textStyle="bold" />
	    
	    <TextView
	        android:id="@+id/tv_subText"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="Subtext"
	        android:textColor="@color/black"
	        android:textSize="12dp"
	        android:gravity="center" />
</LinearLayout>

Код: Выделить всё

        ll_button = (LinearLayout) findViewById(R.id.ll_button);
        tv_text = (TextView) findViewById(R.id.tv_text);
        tv_subText = (TextView) findViewById(R.id.tv_subText);

ll_button.setOnTouchListener(new OnTouchListener() {
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			if (event.getAction() == MotionEvent.ACTION_DOWN) {
				tv_text.setTextColor(getResources().getColor(R.color.red));
				return false;
			} else if (event.getAction() == MotionEvent.ACTION_UP) {
				tv_text.setTextColor(getResources().getColor(R.color.black));
				return false;
			}
			return false;
		}
	});
Напрямую подключить xml описание state'ов естественно не выйдет. Еще можно подумать о наследовании типа Button в java коде и вставке его в layout

Yusyuriv
Сообщения: 12
Зарегистрирован: 14 май 2012, 08:30

Re: Две строки разным размером шрифта на одной кнопке

Сообщение Yusyuriv » 26 май 2012, 17:05

Странно, раньше так делал - цвет менялся с запозданием (кнопка уже загоралась, а цвет менялся только через секунду), сейчас - всё нормально. Благодарю :) Не подскажете ещё - если нажать на этот LinearLayout и провести пальцем за его пределы - его фон меняется, как и должен, а как сделать, чтобы вместе с фоном и цвет обратно менялся?
Так не получается:

Код: Выделить всё

if(event.getAction() == MotionEvent.ACTION_UP ||
                    event.getAction() == MotionEvent.ACTION_CANCEL ||
                    event.getAction() == MotionEvent.ACTION_OUTSIDE)
andev писал(а):Еще можно подумать о наследовании типа Button в java коде и вставке его в layout
А стоит ли, ради одной кнопки?

Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Re: Две строки разным размером шрифта на одной кнопке

Сообщение andev » 27 май 2012, 02:45

>> Странно, раньше так делал - цвет менялся с запозданием (кнопка уже загоралась, а цвет менялся только через секунду), сейчас - всё нормально.
Сейчас, скорее, наоборот - сначала меняется цвет TextView, затем, с запозданием 0.2-0.5 секунды (но все же вполне различимым на глаз). Т.е. данная реализация не повторяет подстановку state в xml, к сожалению, в которой нажатие и цвет меняются строго синхронно.
>> Не подскажете ещё - если нажать на этот LinearLayout и провести пальцем за его пределы - его фон меняется, как и должен, а как сделать, чтобы вместе с фоном и цвет обратно менялся?

В первом приближении вот так можно:

Код: Выделить всё

} else if (event.getAction() == MotionEvent.ACTION_MOVE) {					
		int vw, vh;
		float ex, ey;
		vw = v.getWidth();
		vh = v.getHeight();
		ex = event.getX() * event.getXPrecision();
		ey = event.getY() * event.getYPrecision();
		
		if (ex > vw || ey > vh || ex < 0 || ey < 0) {
			tv_text.setTextColor(getResources().getColor(R.color.black));
		}
		
		return false;
	}
Проверяю координаты прикосновения на выход за координаты View, однако отрабатывает опять же немного неточно: цвет меняется раньше, чем фон кнопки, но не по времени, а по координате. Это происходит потому, что палец, как ни странно, толще одного пикселя, а "потухание" фона кнопки, насколько я понял, рассчитывается когда за ее пределы выходит последняя точка из овала прикосновения MotionEvent, в то время как я проверяю X и Y - центры этого прикосновения.
Для того что бы учесть пограничные точки овала-прикосновения, необходимо юзать event.getTouchMajor(), event.getTouchMinor(), что бы определить размеры этого овала и event.getOrientation(), что бы найти угол его поворота в радианах и произвести еще кучу вычислений.
PS вполне вероятно, что можно как-то сразу "вытащить" эти значения, а не рассчитывать их и просто отнять/добавить к координатам края View.

Yusyuriv
Сообщения: 12
Зарегистрирован: 14 май 2012, 08:30

Re: Две строки разным размером шрифта на одной кнопке

Сообщение Yusyuriv » 27 май 2012, 17:48

Отнаследовался от LinearLayout (пытался отнаследоваться от Button, но какие тогда параметры передавать в li.inflate?), но почему-то isPressed всегда false.

Делаю так:

Код: Выделить всё

LayoutInflater li = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = li.inflate(R.layout.signup_button, this, true);
r = getResources();
ec = r.getColor(R.color.white);
rc = r.getColor(R.color.auth_register);
sc = r.getColor(R.color.auth_register_subtext);
text = (TextView) v.findViewById(R.id.authSignupText);
subtext = (TextView) v.findViewById(R.id.authSignupSubtext);

TypedArray a = c.obtainStyledAttributes(attrs,
                       R.styleable.SignupButton);
String str = a.getString(R.styleable.SignupButton_android_text);
if(str != null)
    text.setText(str);
    str = a.getString(R.styleable.SignupButton_subtext);
if(str != null)
    subtext.setText(str);
a.recycle();
И в onDraw:

Код: Выделить всё

protected void onDraw(Canvas c){
    if(isPressed()){
        text.setTextColor(ec);
        subtext.setTextColor(ec);
    } else {
        text.setTextColor(rc);
        subtext.setTextColor(sc);
    }
    super.onDraw(c);
}

Ответить