首先呢,在res文件之下,你的创建attrs文件,在里面把你需要的属性定义出来
<resources> <declare-styleable name="Zidingyi"> <attr name="outban" format="integer"></attr> <attr name="inban" format="integer"></attr> <attr name="colorhuan" format="color"></attr> <attr name="texts" format="string"></attr> <attr name="textsize" format="integer"></attr> </declare-styleable> </resources>然后是布局里面,给你定义的属性赋值
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 重点是这行****** xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <com.bawei.ZidingyiYuan.view.Zidingyi android:id="@+id/myview" android:layout_width="wrap_content" android:layout_height="wrap_content" app:outban="100" app:inban="50" app:colorhuan="#fff000" app:texts="圆环" app:textsize="20" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> </RelativeLayout> 接下来就是代码了,创建一个类继承view,不多说了,直接看代码public class Zidingyi extends View { private int outban; private int inban; private int textsize; private int colorhuan; private String texts; private int currentX; private int currentY; //声明接口 public OnViewItemClickListener onViewItemClickListener; //定义接口 public interface OnViewItemClickListener{ void onViewItemClick(String texts); } //对外提供一个set方法 public void setOnViewItemClickListener(OnViewItemClickListener onViewItemClickListener){ this.onViewItemClickListener=onViewItemClickListener; } public Zidingyi(Context context) { super(context); } public Zidingyi(Context context, AttributeSet attrs) { super(context, attrs); initview(attrs); } public Zidingyi(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private void initview(AttributeSet attrs) { TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.Zidingyi); inban = typedArray.getInt(R.styleable.Zidingyi_inban, 0); outban = typedArray.getInt(R.styleable.Zidingyi_outban, 0); textsize = typedArray.getInt(R.styleable.Zidingyi_textsize, 0); colorhuan = typedArray.getColor(R.styleable.Zidingyi_colorhuan, 0); texts = typedArray.getString(R.styleable.Zidingyi_texts); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(outban * 2, outban * 2); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); currentX = getMeasuredWidth() / 2; currentY = getMeasuredWidth() / 2; canvas.drawColor(Color.GREEN); Paint paint = new Paint(); paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(true); paint.setColor(colorhuan); canvas.drawCircle(currentX, currentY, outban, paint); paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(true); paint.setColor(Color.WHITE); canvas.drawCircle(currentX, currentY, inban, paint); paint.setTextSize(textsize); paint.setColor(Color.BLACK); canvas.drawText(texts, currentX - texts.length() / 2 * textsize, currentY + textsize / 2, paint); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: double sqrt = Math.sqrt((currentX - x) * (currentX - x) + (currentY - y) * (currentY - y)); String texts = ""; if (sqrt < inban) { texts = "在小圆内"; } else if (sqrt < outban && sqrt > inban) { texts = "在大圆内"; }else if(sqrt>outban){ texts="在圆环外"; } if(onViewItemClickListener!=null){ onViewItemClickListener.onViewItemClick(texts); } break; } return true; } }最后是mainActivity里面,接口回调,public class MainActivity extends AppCompatActivity { private Zidingyi myview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myview= (Zidingyi) findViewById(R.id.myview); myview.setOnViewItemClickListener(new Zidingyi.OnViewItemClickListener() { @Override public void onViewItemClick(String texts) { Toast.makeText(MainActivity.this,texts,Toast.LENGTH_SHORT).show(); } }); } }