Android长按Button按钮,产生涟漪效果

package com.zhang.ripple;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;

public class RippleButton extends Button {

private float cx;
private float cy;
private float radius;
private Paint rPaint;
// true为开始绘制
private boolean star = false;
// 设置色值
private int mRippleColoe;
// 设置透明度
private float mAlpha = 255;


public RippleButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub

    rPaint = new Paint();
    // 防锯齿
    rPaint.setAntiAlias(true);
    // 防抖动
    rPaint.setDither(true);
    rPaint.setColor(Color.GREEN);
    // 设置透明度0~255
    rPaint.setAlpha(50);
}

/**
 * 设置涟漪颜色
 * @param mRippleColoe
 */
public void setRippleColor(int mRippleColoe){
    this.mRippleColoe = mRippleColoe;
    onColorOrAlphaChange();
}

/**
 * 设置透明度
 * @see android.view.View#setAlpha(float)
 */
public void setAlpha(float mAlpha){
    this.mAlpha = mAlpha;
    onColorOrAlphaChange();
}

private void onColorOrAlphaChange() {
    rPaint.setColor(mRippleColoe);

    if (mAlpha != 255) {
        int tAlpha = rPaint.getAlpha();
        int realAlpha = (int) (tAlpha*(mAlpha/255f));
        rPaint.setAlpha(realAlpha);
    }
}

Handler hand = new Handler(){
    public void handleMessage(android.os.Message msg) {
        invalidate();
    };
}; 

@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        cx = event.getX();
        cy = event.getY();
        radius = 100;

        star = true;
        new Thread(){

            public void run() {
                while (star) {
                    try {
                        radius = radius + 10;
                        hand.sendEmptyMessage(1);
                        sleep(16);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            };
        }.start();

        break;
    case MotionEvent.ACTION_UP:
        // 停止绘制涟漪
        star = false;
        radius = 0;
        invalidate();

        break;
    case MotionEvent.ACTION_MOVE:
        break;

    default:
        break;
    }

    return super.onTouchEvent(event);
}

@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub

    canvas.drawCircle(cx, cy, radius, rPaint);

    super.onDraw(canvas);
}

}

下载:http://download.csdn.net/download/u014333053/9878584

其实就是在原有的canvas基础上再画一层,
初始化完RippleButton之后,调用RippleButton中的setRippleColor和setAlpha就可以设置涟漪的颜色和透明度了。

欢迎纠错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Android中的GestureDetector类来检测按事件,并使用AudioManager类来调整音量。在按事件开始时,你可以调用AudioManager中的getStreamMaxVolume()方法获取最大音量值,然后在按事件期间根据时间的流逝逐渐增加音量值,并使用setStreamVolume()方法设置音量。你还可以使用Handler类来处理定期更新音量值的任务。 以下是一个简单的示例代码: ``` button.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); final int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); final int timeInterval = 50; // 定时更新时间间隔 final int volumeStep = maxVolume / (1000 / timeInterval); // 每次增加的音量值 final Handler handler = new Handler(); final Runnable updateVolume = new Runnable() { int currentVolume = 0; @Override public void run() { currentVolume += volumeStep; if (currentVolume > maxVolume) { currentVolume = maxVolume; } audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0); // 第三个参数是可选的,指定音量变化时是否显示系统音量控制UI if (currentVolume < maxVolume) { handler.postDelayed(this, timeInterval); } } }; handler.post(updateVolume); return true; } }); ``` 注意:在使用此代码时,请将其适当地修改以适应您的应用程序需求,并确保在使用音量控制时遵循适当的法规和用户隐私政策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值