android自定义控件波纹ripple效果

本文介绍了一个自定义TextView控件`TestXferModeRippleView`,通过监听触摸事件,实现波纹效果。当按下时,计算触摸点到控件四边的距离,启动动画以最大距离为半径绘制圆形波纹;松开时,波纹逐渐消失。代码中使用了动画、Paint对象和ReentrantLock来控制绘图与交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



public class TestXferModeRippleView extends TextView
{

   public TestXferModeRippleView(Context context)
   {
      super(context);
      init();
   }

   public TestXferModeRippleView(Context context, AttributeSet attrs)
   {
      super(context, attrs);
      init();
   }

   private void init()
   {
      m_Paint = new Paint(Paint.ANTI_ALIAS_FLAG);
      m_Paint.setColor(Color.GREEN);
      m_Paint.setTextSize(60);
      m_Paint.setStyle(Paint.Style.FILL);
      m_Paint.setStrokeWidth(2f);
      m_Paint.setColor(Color.BLUE);

      m_DPoint = new PointF(0, 0);
   }

   @Override
   public boolean onTouchEvent(MotionEvent event)
   {
      switch(event.getAction())
      {
         case MotionEvent.ACTION_DOWN:
            isKeyUP = false;
            //判断落点,处理点击事件
            float pW = event.getX();
            float pH = event.getY();
            m_Dis[0] = (int)Math.sqrt(Math.pow(pW, 2) + Math.pow(pH, 2));
            m_Dis[1] = (int)Math.sqrt(Math.pow(pW, 2) + Math.pow(getHeight() - pH, 2));
            m_Dis[2] = (int)Math.sqrt(Math.pow(getWidth() - pW, 2) + Math.pow(pH, 2));
            m_Dis[3] = (int)Math.sqrt(Math.pow(getWidth() - pW, 2) + Math.pow(getHeight() - pH, 2));
            m_DPoint.set(pW, pH);
            rippleAnimate(Math.max(m_Dis[0], Math.max(m_Dis[1], Math.max(m_Dis[2], m_Dis[3]))));
            break;
         case MotionEvent.ACTION_MOVE:

            break;
         case MotionEvent.ACTION_UP:
            isKeyUP = true;
            rippleAnimate(0);
            break;
         default:
            break;
      }

      return true;
   }

   @Override
   protected void onDraw(Canvas c)
   {
      super.onDraw(c);
      c.save();
      //
      m_Lock.lock();
      drawRipple(c);
      m_Lock.unlock();
      c.restore();
   }

   private void drawRipple(Canvas c)
   {

      m_Paint.setAlpha(100);
      c.drawCircle(m_DPoint.x, m_DPoint.y, m_RipRadius, m_Paint);
   }

   private void rippleAnimate(final int radius)
   {
      if(m_RippleAnimator != null)
      {
         m_RippleAnimator.cancel();
         m_RippleAnimator = null;
      }
      m_RippleAnimator = new Animation()
      {
         @Override
         protected void applyTransformation(float interpolatedTime, Transformation t)
         {
            m_RipRadius = (int)(radius * interpolatedTime);
            TestXferModeRippleView.this.postInvalidate();
            if(interpolatedTime == 1)
               if(isKeyUP)
                  m_RipRadius = 0;
         }
      };
      m_RippleAnimator.setDuration(500);
      m_RippleAnimator.setInterpolator(new LinearInterpolator());
      startAnimation(m_RippleAnimator);
   }

   private boolean isKeyUP;
   private ReentrantLock m_Lock = new ReentrantLock();
   private Paint m_Paint;
   private PointF m_DPoint;
   private int m_RipRadius;
   private final int[] m_Dis = new int[4];
   private Animation m_RippleAnimator;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值