Android 如何自定义一个简单的组件和自定义的点击事件(中级)
Android如何自定义一个简单的组件和自定义的点击事件(中级)
这里自定义组件的代码是最初学习时下载的代码片段忘了出处
直接上代码注意看代码中的注释
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:my="http://schemas.android.com/apk/res/com.skyoceanone.zidingyiView"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<com.skyoceanone.zidingyiView.zidingyi
android:layout_width="fill_parent"
android:layout_height="fill_parent"
my:textColor="#ff00ff"
my:textSize="10sp"
android:id="@+id/zidingyi">
</com.skyoceanone.zidingyiView.zidingyi>
</LinearLayout>
在values中定义attr.xml来定义你的组件的属性个人认为这个xml就是起到一个中介作用连接Layout和代码的一个桥梁
<?xmlversion="1.0"encoding="utf-8"?>
<resources>
<declare-styleablename="MyView">
<attrformat="color"name="textColor"/>
<attrname="textSize"format="dimension"/>
</declare-styleable>
</resources>
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.Paint.Style;
importandroid.util.AttributeSet;
importandroid.view.KeyEvent;
importandroid.view.View;
/**
*1这个是自定义的TextView.
*2至少需要重载构造方法和onDraw方法
*3对于自定义的View如果没有自己独特的属性,可以直接在xml文件中使用就可以了
*4如果含有自己独特的属性,那么就需要在构造函数中获取属性文件attrs.xml中自定义属性的名称
*5并根据需要设定默认值,放在在xml文件中没有定义。
*6如果使用自定义属性,那么在应用xml文件中需要加上新的schemas
*7比如这里是xmlns:my="http://schemas.android.com/apk/res/com.skyoceanone.zidingyiView"
*8其中xmlns后的“my”是自定义的属性的前缀,res后的是我们自定义View所在的包
*/
publicclasszidingyiextendsView{
PaintmPaint;//画笔,包含了画几何图形、文本等的样式和颜色信息
privateOnZidingyiListeneronZidingyiListener;
publiczidingyi(Contextcontext){
super(context);
//TODOAuto-generatedconstructorstub
}
publiczidingyi(Contextcontext,AttributeSetattrs){
super(context,attrs);
mPaint=newPaint();
//TypedArray是一个用来存放由context.obtainStyledAttributes获得的属性的数组
//在使用完成后,一定要调用recycle方法
//属性的名称是styleable中的名称+“_”+属性名称
TypedArraymTypedArray=context.obtainStyledAttributes(attrs,R.styleable.MyView);
//提供默认值,放置未指定
inttextcolor=mTypedArray.getColor(R.styleable.MyView_textColor,0XFF00FF00);
floattextsize=mTypedArray.getDimension(R.styleable.MyView_textSize,100);
mPaint.setColor(textcolor);
mPaint.setTextSize(textsize);
mTypedArray.recycle();//一定要调用,否则这次的设定会对下次的使用造成影响
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
//Canvas中含有很多画图的接口,利用这些接口,我们可以画出我们想要的图形
//mPaint=newPaint();
//mPaint.setColor(Color.RED);
mPaint.setStyle(Style.FILL);//设置填充
canvas.drawRect(100,100,200,200,mPaint);//绘制矩形还有很多形状可以看方法
mPaint.setColor(Color.BLUE);
canvas.drawText("oymygood",100,100,mPaint);
// 下面两个注释的方法也是经常用到的
// invalidate();如果你有其他需要画得调用这个方法会激发onDRAW
// postInvalidate();在其他非主线程中使用可以防止ANR
}
//下面两个方法是自定义点击事件
@Override//复写这个方法来实现判断是哪个按钮做出的事件
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if(KeyEvent.KEYCODE_ENTER==keyCode)
{
onZidingyiListener.onZDYClick(zidingyi.this,keyCode);
}
returnsuper.onKeyDown(keyCode,event);
}
publicvoidsetOnZidingyiListener(OnZidingyiListeneronZidingyiListener){
this.onZidingyiListener=onZidingyiListener;
}
}
下面我们开始自定义点击事件
先看实现自定义组件显示和点击事件的Main方法类代码
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.View;
publicclassmainactivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
//TODOAuto-generatedmethodstub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
zidingyizidingyi=(com.tarena.zidingyiView.zidingyi)findViewById(R.id.zidingyi);
//调用自定义组件中自定义的点击事件方法(看上面带桔色的方法)
//这个方法需要传入一个我们定义的接口(下面红色的接口类)
//接口中的抽象方法需要我们传入一个自定义组件和识别点击事件的一个int值
zidingyi.setOnZidingyiListener(newOnZidingyiListener(){
@Override
publicvoidonZDYClick(com.tarena.zidingyiView.zidingyizidingyi,
intkeyCode){
//写需要的代码
}
});
}
}
写一个接口类模仿View的点击事件的接口
importandroid.content.DialogInterface;
publicinterfaceOnZidingyiListener{
publicvoidonZDYClick(zidingyizidingyi,intwhich);
}
出来的效果
大家看这个效果和我上面的代码设置的左上坐标都是从100开始的为什么我们文字没有在画的方框里呢这个问题我想了半天百思不得其解结果我仔细看了下恍然大悟哈哈这里先不给大家答案如果大家也遇到这个问题到时候记得问我把
更多相关文章
- Android 针对ListActivity中ListView 点击事件和长按事件
- Android自定义View的实现方法,带你一步步深入了解View(三) 。
- 【移动开发】Android中图片过大造成内存溢出,OOM(OutOfMemory)异常
- Android 超简单的录制屏幕视频及生成GIF文件的方法
- android中的布局 (一)TextView 的属性介绍
- 控件事件android中自定义控件
- Android处理图片OOM的若干方法小结
- exp:Android Studio调试系统源码的方法 (干货分享)
- android activity 基类 通用方法