求一个类似最新版360的那个点击效果的demo
lpk_6 2015-05-19 05:51:33 就是一个点击之后。画圆的过程。不过速度。方向 以及最后为何画出来的是半圆棱角。搞不懂啊。
这个是我的
package com.example.dyqcsaleforuser.View;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ViewTreeObserver;
import android.widget.Button;
public class MyView extends Button {
/**
* 最大的不透明度,完全不透明
*/
private static final int MAX_ALPHA = 255;
protected static final int FLUSH_ALL = -1;
Canvas can;
// private boolean isStart = true;
// private Wave wave;
/**
* 按下的时候x坐标
*/
private int xDown;
/**
* 按下的时候y的坐标
*/
private int yDown;
/**
* 用来表示圆环的半径
*/
private float radius;
private int alpha;
private Paint p;
float width;
boolean flagone, flagtwo;
static float x;
int wei;
private String text;
int hi;
/*
* 1、两参构造函数
*/
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
xDown = 0;
yDown = 0;
radius = 0;
width = 0;
flagone = true;
flagtwo = false;
alpha = MAX_ALPHA;
p = initPaint(alpha);
ViewTreeObserver VTO = getViewTreeObserver();
VTO.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
wei = getMeasuredWidth();
hi = getHeight();
return true;
}
});
}
public void settext(String te) {
text = te;
}
/**
* onMeasure方法,确定控件大小,这里使用默认的
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
/**
* 画出需要的图形的方法,这个方法比较关键
*/
protected void onDraw(Canvas canvas) {
// 重绘所有圆环
can = canvas;
can.drawCircle(xDown, yDown, radius, p);
Paint pi = new Paint();
pi.setTextSize(18f);
pi.setColor(android.graphics.Color.parseColor("#666666"));
can.drawText(text, wei / 2, hi / 2, pi);
}
/**
* 初始化paint
*/
private Paint initPaint(int alpha) {
/*
* 新建一个画笔
*/
p = new Paint();
p.setAntiAlias(true);
p.setAlpha(alpha);
p.setColor(Color.GRAY);
return p;
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
flushState();
invalidate();
if (flagone) {
handler.sendEmptyMessageDelayed(0, 5);
}
break;
case 1:
flushtwo();
invalidate();
if (flagtwo) {
handler.sendEmptyMessageDelayed(1, 5);
}
break;
case 2:
invalidate();
handler.removeMessages(0);
handler.removeMessages(1);
break;
}
}
private void flushState() {
radius += 25;
x = radius;
alpha = 255;
// Log.i("半径", radius + "");
// Log.i("长度", wei + "");
// if (radius * 2 > wei) {
// alpha = 0;
// }
p.setAlpha(alpha);
}
private void flushtwo() {
radius += 25;
Log.i("LPK", radius + "");
if (radius > wei * 2) {
alpha = 0;
flagtwo = false;
// handler.sendEmptyMessage(2);
}
// handler.removeMessages(1);
p.setAlpha(alpha);
}
};
/**
* 刷新状态
*/
@Override
/**
* 触摸事件的方法
*/
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
flagone = true;
flagtwo = false;
handler.removeMessages(0);
handler.removeMessages(1);
radius = 0;
alpha = MAX_ALPHA;
xDown = (int) event.getX();
yDown = (int) event.getY();
p = initPaint(alpha);
invalidate();
handler.sendEmptyMessage(0);
break;
// 点击之后刷洗一次图形
case MotionEvent.ACTION_UP:
handler.removeMessages(0);
flagone = false;
flagtwo = true;
handler.removeMessages(1);
alpha = MAX_ALPHA;
p = initPaint(alpha);
radius = x;
invalidate();
handler.sendEmptyMessage(1);
// handler.removeMessages(1);
break;
}
return true;
}
}
求一个哥们帮忙改进一哈。