看旁边同事在搞,自己就也试试,完全canvas画出来的,至于优化什么的全部没有,自己搞着玩吧
package com.example.clock;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
public class ClockView extends View{
Paint p;
float left;
float top;
Dian tempD;
float tempX=-1;
float tempY;
float tempX1=-1;
float tempY1;
List<Dian> dian=new ArrayList<Dian>();
List<Dian> list=new ArrayList<Dian>();
boolean isTouched=false;
@SuppressLint("NewApi")
public ClockView(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
p=new Paint();
p.setStrokeWidth(15);
tempD=new Dian();
// TODO Auto-generated constructor stub
}
@SuppressLint("NewApi")
public ClockView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
p=new Paint();
p.setStrokeWidth(15);
tempD=new Dian();
}
public ClockView(Context context, AttributeSet attrs) {
super(context, attrs);
p=new Paint();
p.setStrokeWidth(15);
tempD=new Dian();
}
public ClockView(Context context) {
super(context);
p=new Paint();
p.setStrokeWidth(15);
tempD=new Dian();
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
left=getLeft();
top=getTop();
p.setColor(Color.BLACK);
drawDian(canvas,getWidth(),getHeight());
for (Dian d : list) {
if(d.getX1()!=-1){
canvas.drawLine(d.getX1(), d.getY1(), d.getX2(), d.getY2(), p);
}
}
if(tempX!=-1){
canvas.drawLine(tempX, tempY, tempX1, tempY1, p);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
int n=isTouchOk((int)event.getX(),(int)event.getY(), getWidth());
if(n==-1){
return false;
}
if(isTouched){
list.clear();
}
tempX=dian.get(n).getX1();
tempY=dian.get(n).getY1();
Dian dd=new Dian();
dd.setX2((int)event.getX());
dd.setY2((int)event.getY());
dd.setIstouch(true);
list.add(dd);
return true;
case MotionEvent.ACTION_MOVE:
tempX1=event.getX();
tempY1=event.getY();
int e=isTouchOk((int)tempX1,(int)tempY1,getWidth());
if(e!=-1){
Dian ddd=new Dian();
ddd.setX1(list.get(list.size()-1).getX2());
ddd.setY1(list.get(list.size()-1).getY2());
ddd.setX2(dian.get(e).getX1());
ddd.setY2(dian.get(e).getY1());
dian.get(e).setIstouch(true);
list.add(ddd);
tempX=dian.get(e).getX1();
tempY=dian.get(e).getY1();
}
invalidate();
break;
case MotionEvent.ACTION_UP:
isTouched=true;
tempX=-1;
invalidate();
break;
default:
break;
}
return super.onTouchEvent(event);
}
void drawDian(Canvas c,int w,int h){
c.drawCircle(left+w/3/2, top+h/3/2, w/3/3, p);
Dian d1=new Dian();
d1.setX1((int)(left+w/3/2));
d1.setY1((int)(top+h/3/2));
dian.add(d1);
c.drawCircle(left+w/3/2+w/3, top+h/3/2, w/3/3, p);
Dian d2=new Dian();
d2.setX1((int)(left+w/3/2+w/3));
d2.setY1((int)(top+h/3/2));
dian.add(d2);
c.drawCircle(left+w/3/2+w/3*2, top+h/3/2, w/3/3, p);
Dian d3=new Dian();
d3.setX1((int)(left+w/3/2+w/3*2));
d3.setY1((int)(top+h/3/2));
dian.add(d3);
c.drawCircle(left+w/3/2, top+h/3/2+h/3, w/3/3, p);
Dian d4=new Dian();
d4.setX1((int)(left+w/3/2));
d4.setY1((int)(top+h/3/2+h/3));
dian.add(d4);
c.drawCircle(left+w/3/2+w/3, top+h/3/2+h/3, w/3/3, p);
Dian d5=new Dian();
d5.setX1((int)(left+w/3/2+w/3));
d5.setY1((int)( top+h/3/2+h/3));
dian.add(d5);
c.drawCircle(left+w/3/2+w/3*2, top+h/3/2+h/3, w/3/3, p);
Dian d6=new Dian();
d6.setX1((int)(left+w/3/2+w/3*2));
d6.setY1((int)(top+h/3/2+h/3));
dian.add(d6);
c.drawCircle(left+w/3/2, top+h/3/2+h/3*2, w/3/3, p);
Dian d7=new Dian();
d7.setX1((int)(left+w/3/2));
d7.setY1((int)(top+h/3/2+h/3*2));
dian.add(d7);
c.drawCircle(left+w/3/2+w/3, top+h/3/2+h/3*2, w/3/3, p);
Dian d8=new Dian();
d8.setX1((int)(left+w/3/2+w/3));
d8.setY1((int)( top+h/3/2+h/3*2));
dian.add(d8);
c.drawCircle(left+w/3/2+w/3*2, top+h/3/2+h/3*2, w/3/3, p);
Dian d9=new Dian();
d9.setX1((int)(left+w/3/2+w/3*2));
d9.setY1((int)( top+h/3/2+h/3*2));
dian.add(d9);
}
int isTouchOk(int x,int y,int w){
int temp;
for (int i = 0; i < dian.size(); i++) {
temp=(int) Math.sqrt(Math.abs(x-dian.get(i).getX1())*Math.abs(x-dian.get(i).getX1())
+Math.abs(y-dian.get(i).getY1())*Math.abs(y-dian.get(i).getY1()));
if(temp<w/3/3){
System.out.println(dian.get(i).isIstouch());
if(!dian.get(i).isIstouch()){
return i;
}
}
}
return -1;
}
}