iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android如何实现水波纹控件
  • 302
分享到

Android如何实现水波纹控件

android 2023-05-30 23:05:18 302人浏览 薄情痞子
摘要

小编给大家分享一下Android如何实现水波纹控件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!有很多app使用过水波纹的这样的效果,看着很酷酷的样子,所以自己就

小编给大家分享一下Android如何实现水波纹控件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

有很多app使用过水波纹的这样的效果,看着很酷酷的样子,所以自己就撸码写了一个。

Android如何实现水波纹控件

实现思路:

利用贝塞尔曲线绘制圆弧(也就是水波的波纹)
通过动画改变绘制的起始点使水波纹平移

首先,定义我们需要的自定义属性。

<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="waveStyleable">  <!-- 水波纹的长度-->  <attr name="waveLength" fORMat="float"></attr>  <!-- 水波纹的高度-->  <attr name="waveHeight" format="float"></attr>  <!-- 水波纹的速度-->  <attr name="waveSpeed" format="float"></attr>  <!--水波纹上方的头像 -->  <attr name="waveTopIcon" format="reference"></attr>  <!--水波的颜色 -->  <attr name="waveColor" format="color"></attr>  <!--水波距离底部的距离 -->  <attr name="distanceY" format="float"></attr> </declare-styleable></resources>

自定义view绘制水波纹控件

public class WaveView extends View { private Paint paint; private Path path; private float waveLength ; private float waveHeight ; private float waveSpeed ; private Bitmap bitmap; private int waveColor ; private int strokeWidth = 3; private Region region; private int width,height; public int translateX ; private float distanceY; public WaveView(Context context) {  super(context); } public WaveView(Context context, AttributeSet attrs) {  super(context, attrs);  TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.waveStyleable);  waveLength = array.getFloat(R.styleable.waveStyleable_waveLength,300);  waveColor = array.getColor(R.styleable.waveStyleable_waveColor,0x00ff00);  waveHeight = array.getFloat(R.styleable.waveStyleable_waveHeight,100);  waveSpeed = array.getFloat(R.styleable.waveStyleable_waveSpeed,5);  distanceY = array.getFloat(R.styleable.waveStyleable_distanceY,100);  Drawable waveTopICon = array.getDrawable(R.styleable.waveStyleable_waveTopIcon);  array.recycle();  bitmap = drawableToBitmap(waveTopICon);  initPaint();  startAnimal(); } private void initPaint() {  paint = new Paint();  paint.setStyle(Paint.Style.FILL);  paint.setColor(waveColor);  paint.setStrokeWidth(strokeWidth);  //绘制贝塞尔曲线的path  path = new Path(); } @Override protected void onDraw(canvas canvas) {  super.onDraw(canvas);  //绘制贝塞尔曲线  drawPath(canvas,path);  //绘制wave上部的头像  drawIcon(canvas); } private void drawIcon(Canvas canvas) {  float baseLine = height-distanceY;  if(region.getBounds().top==baseLine){   canvas.drawBitmap(bitmap,width/2-bitmap.getWidth()/2,region.getBounds().bottom-bitmap.getHeight(),paint);  }else {   if(region.getBounds().top==0){    canvas.drawBitmap(bitmap,width/2-bitmap.getWidth()/2,height-bitmap.getHeight()-distanceY,paint);   }   canvas.drawBitmap(bitmap,width/2-bitmap.getWidth()/2,region.getBounds().top-bitmap.getHeight(),paint);  } } private void drawPath(Canvas canvas, Path path) {  path.reset();  //path的起始点,向手机外多绘制一段  path.moveTo(-2* waveLength +translateX,getHeight()-distanceY);  for(int i = 0; i<getWidth()+ waveLength; i+= waveLength){   path.rQuadTo(waveLength /2,-waveHeight, waveLength,0);   path.rQuadTo(waveLength /2,waveHeight, waveLength,0);  }  region = new Region();  Region clip = new Region();  clip.set((int) (getWidth()/2-0.1),0,getWidth()/2,getHeight()*2);  region.setPath(path,clip);  path.lineTo(getWidth(),getHeight());  path.lineTo(-waveLength,getHeight());  path.close();  canvas.drawPath(path,paint); } public void startAnimal(){  ValueAnimator animator = ValueAnimator.ofFloat(0,1);  animator.setDuration(3000);  animator.setRepeatCount(ValueAnimator.INFINITE);  animator.setInterpolator(new LinearInterpolator());  animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {   @Override   public void onAnimationUpdate(ValueAnimator animation) {    translateX += waveSpeed;    if(-2* waveLength +translateX >= 0){     translateX = 0;    }    postInvalidate();   }  });  animator.start(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  super.onMeasure(widthMeasureSpec, heightMeasureSpec);  //获取宽高模式  int widthMode = MeasureSpec.getMode(widthMeasureSpec);  int heightMode = MeasureSpec.getMode(heightMeasureSpec);  width = MeasureSpec.getSize(widthMeasureSpec);  height = MeasureSpec.getSize(heightMeasureSpec);  if (widthMode == MeasureSpec.AT_MOST){   width = (int) waveLength;  }  if(heightMode == MeasureSpec.AT_MOST){   height = (int) (waveHeight+ distanceY+bitmap.getHeight());  }  setMeasuredDimension(width,height); }  public float dp2px(float dpValue,Context context){  return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpValue,context.getResources().getDisplayMetrics()); }  public Bitmap makeRoundCorner(Bitmap bitmap) {  int width = bitmap.getWidth();  int height = bitmap.getHeight();  int left = 0, top = 0, right = width, bottom = height;  float roundPx = height/2;  if (width > height) {   left = (width - height)/2;   top = 0;   right = left + height;   bottom = height;  } else if (height > width) {   left = 0;   top = (height - width)/2;   right = width;   bottom = top + width;   roundPx = width/2;  }  Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);  Canvas canvas = new Canvas(output);  int color = 0xff424242;  Paint paint = new Paint();  Rect rect = new Rect(left, top, right, bottom);  RectF rectF = new RectF(rect);  paint.setAntiAlias(true);  canvas.drawARGB(0, 0, 0, 0);  paint.setColor(color);  canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));  canvas.drawBitmap(bitmap, rect, rect, paint);  return output; } public Bitmap drawableToBitmap(Drawable drawable) {  Bitmap bitmap = Bitmap.createBitmap(    drawable.getIntrinsicWidth(),    drawable.getIntrinsicHeight(),    drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888      : Bitmap.Config.RGB_565);  Canvas canvas = new Canvas(bitmap);  drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  drawable.draw(canvas);  return makeRoundCorner(bitmap); }}

相关类:

Path: 可以绘制二次曲线或者三次曲线到画布上,moveTo()方法将path移动到手机屏幕的(-2* waveLength,distanceY)这个点,然后以这个点为起始点绘制二次曲线曲线,rQuadTo(),以最后点为相对位置点进行取点绘制。在属性动画里面,不断改变起始点的位置,这样绘制的水波纹就会平移。

Region:表示区域的类,通过set(path,rect)可以获取到矩形区域与path弧线相交的新的矩形。如果rect的宽度无限小,那么获取的矩形区域会近似为一个点,这个点就是图片移动的y坐标。

xml文件使用:

<RelativeLayout xmlns:android="Http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.iwintrue.waveapplication.MainActivity"> <com.iwintrue.waveapplication.WaveView xmlns:app="http://schemas.android.com/apk/res-auto" app:waveLength = "200" app:waveHeight = "50" app:waveSpeed = "10" app:waveColor = "#0ff" app:distanceY = "100" app:waveTopIcon = "@mipmap/icon" android:layout_centerInParent="true" android:id="@+id/waterView" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#f00" /></RelativeLayout>

以上是“Android如何实现水波纹控件”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Android如何实现水波纹控件

本文链接: https://www.lsjlt.com/news/222041.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android如何实现水波纹控件
    小编给大家分享一下Android如何实现水波纹控件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!有很多app使用过水波纹的这样的效果,看着很酷酷的样子,所以自己就...
    99+
    2023-05-30
    android
  • Android如何实现水波纹效果
    这篇文章主要为大家展示了“Android如何实现水波纹效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android如何实现水波纹效果”这篇文章吧。效果图attrs.xml自定义属性 ...
    99+
    2023-06-29
  • Android如何实现渐变色水波纹效果
    这篇文章主要介绍了Android如何实现渐变色水波纹效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。项目中使用到的效果,效果图如下:代码实现:public cla...
    99+
    2023-06-21
  • Android实现水波纹效果实例代码
    效果图 attrs.xml 自定义属性 <declare-styleable name="RippleAnimationView"> <attr...
    99+
    2024-04-02
  • Android自定义View实现水波纹效果
    介绍:水波纹散开效果的控件在 App 里面还是比较常见的,例如 网易云音乐歌曲识别,附近搜索场景。看下实现的效果:实现思路: 先将最大圆半径与最小圆半径间距分成几等份,从内到外,Paint 透明度依次递减,绘制出同心圆,然后不断的改变这些同...
    99+
    2023-05-30
    android view 水波纹
  • Android 自定义view实现水波纹动画效果
    在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了个让人兴奋的效果,兴致高昂的来找你,看了之后目的很明确,当然就是希望你能给她;在这样的关键时候,身子板就一定得硬了,可千万别说不行,爷们儿怎么能说不行呢;好了...
    99+
    2023-05-31
    android 水波纹 roi
  • Android自定义WaveProgressView实现水波纹加载需求
    先看效果图:  你可以定义成你项目的logo图片,可以设置水波颜色、波长、波宽、字体大小、颜色、进度条的最大值,当前进度值,还可以设置波纹震动的快慢。当设置一个进度不变的时候,打开时还有一个动画填满的效果(比如第二个流量显示,这里图片没有截...
    99+
    2023-05-30
    android waveprogressview 水波纹
  • Android自定义View实现水波纹扩散效果
    目录1、创建RippleView.class, 继承与View1.1特殊属性解释 1.2新建attrs.xml文件(res/values)1.3初始化画笔2、开始绘制onD...
    99+
    2024-04-02
  • Android自定义水波纹底部导航的实现
    今天给大家带来一个自定义的底部导航,我不会做动图,只能搞一张图片给大家看看,大家见谅 这个就是自定义的tablayout底部搞好的样式了 TabLayout提供了一个水平布局用于展...
    99+
    2022-11-13
    Android 水波纹底部导航 Android 水波纹
  • Vue怎么实现加水波纹效果
    本篇内容主要讲解“Vue怎么实现加水波纹效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue怎么实现加水波纹效果”吧!自定义指令指令的作用言简意赅,就是操作底层dom当然vue自身有非常强大...
    99+
    2023-06-29
  • Android如何自定义View实现横向的双水波纹进度条
    目录思路分析 功能实现 1.绘制圆角背景和圆角矩形边框 2.通过贝塞尔曲线实现双水波 3.设置动画使进度和水波纹变化 结语 网上垂直的水波纹进度条很多,但横向的很少,将垂直的水波纹改...
    99+
    2024-04-02
  • Android Button修改背景颜色及实现Button水波纹效果
    Android Button修改背景颜色及实现Button水波纹效果,效果如下:   以下基于API33(Android13.0),向下兼容至API24(Android7.0)。 1.修改Button背景 我们可以发现在布局xml文件中...
    99+
    2023-09-12
    android
  • 如何使用CSS制作水波纹效果
    这篇文章主要介绍了如何使用CSS制作水波纹效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、首先html创建新文件,定义6个div标签。...
    99+
    2024-04-02
  • Android 通过自定义view实现水波纹效果案例详解
    在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了个让人兴奋的效果,兴致高昂的来找你,看了之后目的很明确,当然就是希望你能给她; 在这样的关键时候,身...
    99+
    2024-04-02
  • css3+javascript按钮水波纹效果怎么实现
    小编给大家分享一下css3+javascript按钮水波纹效果怎么实现,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!css3+js实现按钮水纹涟漪效果HTML首先我们用<a>标签定义两个按钮<a ...
    99+
    2023-06-14
  • 如何使用HTML5 Canvas制作水波纹效果
    本篇内容介绍了“如何使用HTML5 Canvas制作水波纹效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • Android怎么自定义View实现横向的双水波纹进度条
    这篇文章将为大家详细讲解有关Android怎么自定义View实现横向的双水波纹进度条,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。思路分析整体效果可分为三个,绘制圆角背景和圆角矩形,绘制第一条和第二条水波...
    99+
    2023-06-25
  • 纯CSS实现鼠标点击水波纹效果的实现步骤
    鼠标点击水波纹效果是Web开发中常见的交互效果之一,它能够为用户带来更加生动的体验。在本文中,我们将分享如何使用纯CSS来实现这一效果,并提供具体的代码示例。实现步骤如下:步骤1:HTML结构首先,在HTML文件中创建一个具有鼠标点击效果的...
    99+
    2023-10-21
    CSS 鼠标点击 水波纹效果
  • 纯CSS怎么实现水波纹的电池充电动画特效
    本篇内容主要讲解“纯CSS怎么实现水波纹的电池充电动画特效”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“纯CSS怎么实现水波纹的电池充电动画特效”吧!前置知识:...
    99+
    2024-04-02
  • CSS如何实现波动水球效果
    这篇文章将为大家详细讲解有关CSS如何实现波动水球效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。今天学习到了一个新的css特效,波动水球效果,也是非常的好看HTML:<!DOCTYPE ...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作