android简单仿android5.0点击波纹效果 , 没啥好说的,无非就是canvas.drawCircle。有兴趣的朋友之间拿去用吧!
就贴下listview的代码吧。
package com.baodian.view;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
public class WaterListView extends ListView{
private float centerX , centerY ;
private float mRevealRadius = 1 , maxRadius;
private Paint mPaint ;
private int count = 1;
private WhenClickCallback l ;
private View itemView ;
private int itemPosition ;
private long itemID ;
private Rect clipRect ;
public WaterListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mPaint = new Paint() ;
mPaint.setColor(Color.argb(88, 73, 57, 0xdc));
mPaint.setAntiAlias(true) ;
setSelector(new ColorDrawable(Color.TRANSPARENT)) ;
}
public void setWaterColor(int color){
mPaint.setColor(color) ;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP){
centerX = event.getX() ;
centerY = event.getY() ;
mRevealRadius = 1 ;
}
return super.onTouchEvent(event);
}
public WaterListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public WaterListView(Context context) {
this(context , null);
}
@Override
public boolean performItemClick(View view, int position, long id) {
itemView = view ;
itemPosition = position ;
itemID = id ;
View item = getChildAt(position - getFirstVisiblePosition());
clipRect = new Rect(item.getLeft() , item.getTop(), item.getLeft()+item.getWidth() , item.getTop()+item.getHeight());
float maxX = Math.max(centerX - item.getLeft(), item.getWidth() - centerX - item.getLeft() );
float maxY = Math.max(centerY -item.getTop(), item.getHeight() - centerY- item.getTop());
maxRadius = (float) Math.sqrt(maxX*maxX + maxY*maxY) ;
invalidate();
return false;
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if(itemView != null){
int previewCount = count - 1 ;
if(mRevealRadius - previewCount*previewCount > maxRadius){
if(count !=1){
count = 1 ;
invalidate() ;
super.performItemClick(itemView, itemPosition, itemID) ;
itemView = null ;
itemID = 0 ;
}
return ;
}
canvas.save();
canvas.clipRect(clipRect);
canvas.drawCircle(centerX, centerY, mRevealRadius , mPaint);
canvas.restore();
mRevealRadius += count*count ;
count ++ ;
postInvalidateDelayed(20);
}
}
}