今天跟大家分享一下Android自定义控件入门,先介绍一个简单的效果TextView,按下改变字体颜色,后期慢慢扩展更强大的功能
直接看图片
第一张是按下后截的图,功能很简单,也很容易实现,下面来看一下如何通过重写TextView来实现
一共三个文件 TextViewM.java,MainActivity.java,activity_textview.xml
TextViewM.java
package landptf.control; import android.content.Context; import android.graphics.Color; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.TextView; /** * 重写TextView 实现点击改变字体颜色 * @author landptf * @date 2015-6-6 */ public class TextViewM extends TextView{ private int textColori = 0;//控件的文字颜色,Int型 private String textColors = "";//控件的文字颜色,String型 private int textColorSeletedi = 0;//控件被按下后的文字颜色,Int型 private String textColorSeleteds = "";//控件被按下后的文字颜色,String型 public TextViewM(Context context) { this(context, null); } public TextViewM(Context context, AttributeSet attrs) { this(context, attrs, 0); } /** * 实现TextView的构造方法 * @param context * @param attrs * @param defStyle */ public TextViewM(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); //设置TextView的Touch事件 this.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent event) { //设置颜色变化 setColor(event.getAction()); //注意此处的返回值,若想设置TextView的Click事件,则返回false return true; } }); } //设置颜色变化,该方法为private,不对外公开 private void setColor(int state){ try { //根据传过来的MotionEvent值来设置文字颜色 if (state == MotionEvent.ACTION_DOWN) { //鼠标按下 if (textColorSeletedi != 0) { setTextColor(textColorSeletedi); }else if (!textColorSeleteds.equals("")) { setTextColor(Color.parseColor(textColorSeleteds)); } } if (state == MotionEvent.ACTION_UP) { //鼠标抬起 if (textColori == 0 && textColors.equals("")) { //如果为设置颜色值,则默认为黑色 setTextColor(Color.BLACK); }else if (textColori != 0) { setTextColor(textColori); }else { setTextColor(Color.parseColor(textColors)); } } } catch (Exception e) { } } /** * 设置文字的颜色 * 为了不造成原setTextColor的冲突,在后面加“i” * @param color int类型 */ public void setTextColori(int color) { this.textColori = color; try { this.setTextColor(color); } catch (Exception e) { } } /** * 设置文字的颜色 * 为了不造成原setTextColor的冲突,在后面加“s” * @param color String类型 */ public void setTextColors(String color) { this.textColors = color; try { this.setTextColor(Color.parseColor(color)); } catch (Exception e) { } } /** * 设置文字被按下后的颜色 * @param color int类型 */ public void setTextColorSeleted(int textColorSeletedi) { this.textColorSeletedi = textColorSeletedi; } /** * 设置文字被按下后的颜色 * @param color String类型 */ public void setTextColorSeleted(String textColorSeleteds) { this.textColorSeleteds = textColorSeleteds; } }
布局文件activity_textview.xml:
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 tools:ignore="HardcodedText" > 7 8 <landptf.control.TextViewM 9 android:id="@+id/tvText1" 10 android:layout_width="match_parent" 11 android:layout_height="50dp" 12 android:background="#AA6666" 13 android:gravity="center" 14 android:text="TEXT1" 15 android:textSize="20sp" /> 16 17 <landptf.control.TextViewM 18 android:id="@+id/tvText2" 19 android:layout_width="match_parent" 20 android:layout_height="50dp" 21 android:layout_below="@+id/tvText1" 22 android:layout_marginTop="50dp" 23 android:background="#66FF66" 24 android:gravity="center" 25 android:text="TEXT2" 26 android:textSize="20sp" /> 27 28 </RelativeLayout>
测试类:MainActivity.java
package landptf.control; import android.app.Activity; import android.os.Bundle; /** * 测试类 * @author landptf * @date 2015-6-6 */ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_textview); initView(); } //初始化控件 private void initView() { TextViewM tvText1 = (TextViewM) findViewById(R.id.tvText1); //对tvText1设置int型的颜色id tvText1.setTextColori(android.graphics.Color.WHITE); //按下的颜色 tvText1.setTextColorSeleted(android.graphics.Color.GRAY); //对tvText2设置String型的颜色 TextViewM tvText2 = (TextViewM) findViewById(R.id.tvText2); tvText2.setTextColors("#ffffffff"); //按下的颜色 tvText2.setTextColorSeleted("#ff888888"); } }
代码实现的功能比较简单,可以在此基础上继续扩展,比如按下改变背景色等等。这样便可以省去好多xml文件,只通过封装几行代码就可以功能实现一些。
明天再写一个健壮一些的控件。