此方法为最基本的定义控件的写法
首先定义资源文件,attrs中定义控件属性:
<span style="font-size:14px;"><resources>
<declare-styleable name="MyView"> <!-- name为继承view类名,千万不要同系统类名相同 -->
<attr name="textcontent" format="string"/> <!-- name自定义属性名,format选择资源类型 -->
<attr name="textcolor" format="color"/>
<attr name="textbankground" format="reference"/>
<attr name="isshow" format="boolean"></attr>
<attr name="textsize" format="dimension"/>
<attr name="textlocation" format="enum">
<enum name="center" value="0"/>
<enum name="left" value="1"/>
<enum name="right" value="2"/>
</attr>
</declare-styleable>
</resources></span>
然后在xml布局中引用此资源:
在引用时布局中加入行代码:
<span style="font-size:14px;"> xmlns:app="http://schemas.android.com/apk/res-auto"</span>
<pre name="code" class="html"><span style="font-size:14px;"><costomview.MyView <!-- 类名加包名 -->
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:isshow="true"
app:textbankground="@android:color/holo_blue_light"
app:textcontent="自定义控件测试"
app:textlocation="center"
app:textsize="20sp"
/></span>
继承view控件的类实现:
<span style="font-size:14px;">public class MyView extends View {
private String textContent;
private Drawable bankground;
private int location;
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyView);
textContent = ta.getString(R.styleable.MyView_textcontent); //获取布局中置的值
bankground = ta.getDrawable(R.styleable.MyView_textbankground);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
</span>
<span style="font-size:14px;"><span style="white-space:pre"> </span>//绘制调用方法
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(Color.RED); //设置描绘颜色,如果上面取到了值,可以选择设置给paint
paint.setTextSize(40); //设置字体大小
canvas.drawText(textContent,120,240,paint); //描绘字体,及位置,最好采用从组件大小获取值,不要随意写数据
// canvas.drawPoint(100,200,paint);
}
/*
* 检测View组件及其子组件的大小
* */
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
</span><pre name="code" class="java"><span style="font-size:14px;"><span style="white-space:pre"> </span>switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Logs.v("按下事件");
break;
case MotionEvent.ACTION_UP:
Logs.v("弹起事件");
break;
case MotionEvent.ACTION_MOVE:
Logs.v("移动事件");
break;
}
return true; //此处设为true</span>
}} activity实现:在oncreat中
<span style="font-size:14px;"> setContentView(R.layout.myview_layout);</span>
此时就实现了一个最简单,最原始的效果