刚给群里的小伙伴实现了一个自定义view,效果图如下
当我正准备开心地告诉小伙伴我已经实现好了的时候,这个b没装好哈~~~
为了跟小伙伴发的效果图达到几乎相似的效果,于是打算把button按钮样式也给写了(原谅我处女座哈!!)
就是控件最下方的那两个按钮,看到这个按钮样式的时候,小伙伴是不是也第一时间想到定义一个shape文件就好了呢,所以我就去定义了一个shape文件:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false">
<shape>
<corners android:radius="5dp"/>
<stroke android:color="#fff" android:width="1dp"/>
<solid android:color="#00000000"/>
</shape>
</item>
<item android:state_pressed="true">
<shape>
<solid android:color="#00000000"/>
</shape>
</item>
<item>
<shape>
<corners android:radius="5dp"/>
<stroke android:color="#fff" android:width="1dp"/>
<solid android:color="#00000000"/>
</shape>
</item>
</selector>
然后运用在layout文件中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#a7ff0000"
android:gravity="center_horizontal"
android:orientation="vertical">
<com.yasin.measuredemo.view.MeasureView
android:id="@+id/id_measure_view"
android:layout_marginTop="40dp"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="#fff"
android:textSize="14sp"
android:layout_centerVertical="true"
/>
<TextView
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="最近一次测量:%1$s"
android:textColor="#fff"
android:textSize="15sp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="150"
android:textColor="#fff"
android:textSize="14sp"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单次测试"
android:background="@drawable/selector_btn"
android:textColor="#fff"
android:textSize="14sp"
/>
<Button
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单次测试"
android:background="@drawable/selector_btn"
android:textColor="#fff"
android:textSize="14sp"
/>
</RelativeLayout>
</LinearLayout>
可以看到,左边那个按钮我什么都没加,然后貌似默认给了我一个padding值,
于是我修改:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单次测试"
android:background="@drawable/selector_btn"
android:textColor="#fff"
android:textSize="14sp"
android:padding="0dp"
/>
把button的padding值设为了0,还是没用!!!
然后我就给button宽高定死了:
android:layout_width="100d p"
android:layout_height="50dp"
是的!!!可以了~~~
但是我就是不想定死啊,这可咋办,于是想到了是不是系统默认给button设置的样式,于是打开了button源码:
* {@link android.R.styleable#View View Attributes}
* </p>
*/
@RemoteView
public class Button extends TextView {
public Button(Context context) {
this(context, null);
}
public Button(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.buttonStyle);
}
public Button(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public Button(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public CharSequence getAccessibilityClassName() {
return Button.class.getName();
}
}
代码很少,我们看到button默认的样式:
com.android.internal.R.attr.buttonStyle
于是带着怀疑去sdk25源码中找了一番:
<style name="Widget.Toolbar">
<item name="titleTextAppearance">@style/TextAppearance.Widget.Toolbar.Title</item>
<item name="subtitleTextAppearance">@style/TextAppearance.Widget.Toolbar.Subtitle</item>
<item name="minHeight">?attr/actionBarSize</item>
<item name="titleMargin">4dp</item>
<item name="maxButtonHeight">@dimen/action_bar_default_height_material</item>
<item name="buttonGravity">top</item>
<item name="navigationButtonStyle">@style/Widget.Toolbar.Button.Navigation</item>
<item name="collapseIcon">?attr/homeAsUpIndicator</item>
<item name="collapseContentDescription">@string/toolbar_collapse_description</item>
<item name="contentInsetStart">16dp</item>
<item name="contentInsetStartWithNavigation">@dimen/action_bar_content_inset_with_nav</item>
<item name="touchscreenBlocksFocus">true</item>
</style>
<style name="Widget.Toolbar.Button.Navigation" parent="Widget">
<item name="background">?attr/selectableItemBackground</item>
<item name="minWidth">56dp</item>
<item name="scaleType">center</item>
</style>
好吧,终于是找到元凶了,原来系统默认给button的最小值设置成了56dp,怪不得我咋设置高度跟padding都是这个高,唉唉!!
于是对症下药,我们修改我们button的minheight为0:
<Button
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单次测试"
android:background="@drawable/selector_btn"
android:textColor="#fff"
android:textSize="14sp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:minHeight="0dp"
/>
设置完android:minHeight=0dp后,就正常显示了。这算不算sdk25留的坑呢??