activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<com.example.attrsview.BoWenRingWave
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
BoWenRingWave.class
public class BoWenRingWave extends View {
private static final int DIS_SOLP = 13;
public boolean isRunning = false;
private ArrayList<Wave> wlist;
Handler hand = new Handler() {
public void handleMessage(android.os.Message msg) {
flushStatue();
invalidate();
if(isRunning){
hand.sendEmptyMessageDelayed(0,50);
}
};
};
public BoWenRingWave(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
wlist = new ArrayList<Wave>();
}
public void flushStatue() {
for(int i=0 ;i<wlist.size();i++){
Wave w=wlist.get(i);
int a=w.p.getAlpha();
if(w.p.getAlpha()==0){
wlist.remove(i);
continue;
}
a=w.p.getAlpha()-20;
if(a<20){
a=0;
}
w.p.setAlpha(a);
w.r=w.r+10;
w.p.setStrokeWidth(w.r/10);
}
if(wlist.size()==0){
isRunning=false;
}
}
public void addPaintlist(float x, float y) {
Wave w = new Wave();
w.cx = x;
w.cy = y;
Paint p = new Paint();
p.setAlpha(255);
p.setAntiAlias(true);
p.setStyle(Style.STROKE);
p.setColor(color[(int) (Math.random() * 4)]);
w.p = p;
wlist.add(w);
}
private int[] color = new int[] { Color.RED, Color.BLUE, Color.GREEN,
Color.YELLOW };
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
for (int i = 0; i < wlist.size(); i++) {
canvas.drawCircle(wlist.get(i).cx, wlist.get(i).cy, wlist.get(i).r,
wlist.get(i).p);
}
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
float x=event.getX();
float y=event.getY();
addPaint(x, y);
break;
}
return true;
}
public void addPaint(float x, float y) {
// TODO Auto-generated method stub
if(wlist.size()==0){
addPaintlist(x, y);
isRunning=true;
hand.sendEmptyMessage(0);
}else{
Wave w=wlist.get(wlist.size()-1);
if( Math.abs(w.cx-x)>DIS_SOLP|| Math.abs(w.cy-y)>DIS_SOLP){
addPaintlist(x, y);
}
}
}
}
Wave.class
public class Wave {
public float cx;
public float cy;
public Paint p;
public int r;
}