Android点击水波纹扩散效果整理(附带一个自定义的水波纹效果控件)

 

很久很久没有写博客了,说来也有点惭愧。正好最近整理自己的项目工程目录,看到一些值得分享的控件,准备在之后的几篇博客中准备把它们陆续搬运上来。

 

这篇博客准备整理一下Android Material Design自带的点击水波纹扩散的效果。话不多说,开始正题。

水波纹效果分为两种:有界水波纹和无界水波纹。都通过系统自带的动画文件实现。

有界水波纹:

有界水波纹通过系统自带的动画文件 selectableItemBackground 实现只要将其设置为控件的背景即可。简单写几句代码:

<Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="50dp"android:layout_margin="15dp"android:background="?android:attr/selectableItemBackground"android:text="Button" />

效果如下:

无界水波纹:

无界水波纹通过动画文件 selectableItemBackgroundBorderless 实现,用法和有界水波纹一样,修改一下上面的代码:

<Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="50dp"android:layout_margin="15dp"android:background="?android:attr/selectableItemBackgroundBorderless"android:text="Button" />

效果:

可以看到,所谓的有界和无界的区别就在于,有界水波纹扩散不会超出控件自身的边界,而无界水波纹扩散范围是一个正方形区域,正方形的边长取控件高宽的较大值。

当然这样的效果还是太单调,有时我们需要自定义水波纹的颜色,方法也很简单。

有界水波纹:
要自定义有界水波纹的颜色,只需要创建drawable文件,添加ripple节点,将节点的color属性设置为你想要的颜色,再在其下添加item节点,指定该item的id属性为mask即可。
比如说我们定义“button_red_mask”文件:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"android:color="#FF5151"><itemandroid:id="@android:id/mask"android:drawable="@color/colorPrimary" />
</ripple>

item节点中的drawable属性另有用处,之后再讲,但这里并不影响水波纹的颜色,我这里就随便设了一个。之后再将这个文件设置为控件的背景即可:

<Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="50dp"android:layout_margin="15dp"android:background="@drawable/button_red_mask"android:text="Button" />

看看效果:

无界水波纹:
无界水波纹要自定义波纹颜色就更简单了,连上述的item节点都不需要,只需要ripple节点指定其color属性即可。

定义“button_red_mask “文件:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"android:color="#FF5151"></ripple>

再将其设置为控件的背景:

<Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="50dp"android:layout_margin="15dp"android:background="@drawable/button_red_unmask"android:text="Button" />

效果:

除了自定义波纹颜色,你甚至可以自定义波纹的扩散边界。做法也不复杂,就是我们之前提到的item节点中的drawable属性,只需要将drawable属性设置为指定的图片,就可以将该图片作为扩散边界。来试一试。

定义“button_red_mask_icon“文件:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"android:color="#FF5151"><itemandroid:id="@android:id/mask"android:drawable="@drawable/heart" />
</ripple>

将其设置为控件的背景:

<Buttonandroid:id="@+id/button"android:layout_width="350dp"android:layout_height="350dp"android:layout_gravity="center_horizontal"android:background="@drawable/button_red_mask_icon"android:text="Button" />

看看效果:

当然自定义边界所指定的图片,除了真实的图片,自定义的drawble资源也是可以的。

比如说我们先定义一个圆角矩形资源“button_red_up”

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#ff5151" /><corners android:radius="40dp" /></shape>

再定义一个“button_red_mask_shape”文件,将item节点的drawable属性设置为上面的“button_red_up”:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"android:color="#FF5151"><itemandroid:id="@android:id/mask"android:drawable="@drawable/button_red_up" />
</ripple>

最后把它设置成控件的背景:

<Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="50dp"android:layout_margin="15dp"android:background="@drawable/button_red_mask_shape"android:text="Button" />

效果如下:

当然,上面的所有做法,控件的不点击的时候是不显示形状的。有时候我们需要控件的不点击的时候就显示一个指定的形状,那又该怎么做呢?其实也不难,只需要在上述的item节点下,再添加一个shape节点来指定形状即可。 

我们再定义一个“button_red_mask_shape_pro”文件:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"android:color="#20000000"><item><shape><corners android:radius="40dp" /><solid android:color="#FF5151" /></shape></item>
</ripple>

这个文件指定了控件形状为圆角矩形,水波纹颜色为半透明的黑色。再把这个文件设置为控件的背景:

<Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="50dp"android:layout_margin="15dp"android:background="@drawable/button_red_mask_shape_pro"android:text="Button" />

效果:

再进一步,如果还想给按钮再加一个selector效果,即按钮未按下时显示一张图,按下时显示另一张图,也是可以做到的。

先定义一个按钮未按下时的资源“button_red_up”:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#ff5151" /><corners android:radius="40dp" /></shape>

再定义一个按钮按下时的资源“button_red_down”:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#BA3F3F" /><corners android:radius="40dp" /></shape>

然后定义selector资源文件“button_red_mask_shape_selector”:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"android:color="#20000000"><item><selector><itemandroid:state_pressed="true"android:drawable="@drawable/button_red_down"/><itemandroid:state_pressed="false"android:drawable="@drawable/button_red_up"/></selector></item>
</ripple>

其实就是在item节点下再添加一个selector节点,引用之前定义的两个资源即可。最后把控件的背景设置为该资源:

<Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="50dp"android:layout_margin="15dp"android:background="@drawable/button_red_mask_shape_selector"android:text="Button" />

来看看效果:

好了,以上就是Andorid的Material Design中自带的水波纹扩散效果的所有内容了。

 

===========================================================

 

其实之前自己顺手写了一个点击水波纹扩散效果的控件,虽然从来没有用过,这里也顺便拿出来分享一下,没准以后就用上了呢。

话不多说,先看效果:
 

实现的效果是点击时生成一个随手指移动的小圆圈,松开时小圆圈呈现水波纹扩散效果,之前在前端上经常看到这样的设计。

所有代码都被封装在一个视图类里面,复制即可用。上源码:

按钮类 DiffusionButton.java
 

public class DiffusionButton extends AppCompatButton {private Context context;private Paint paint;private Path path;private RectF roundRect;private int width;private int height;private int touchX;private int touchY;private int maxRadius;private int currentRadius;private int invalidateInterval = 10;private boolean isPushButton;private boolean isClickFinish;private boolean isInit;/*** 可设置参数*/// 扩散速度private int speed;// 扩散颜色private int diffusionColor;// 控件圆角半径private int radius;// 控件左上角横向半径private int leftTopRadiusX;// 控件左上角纵向半径private int leftTopRadiusY;// 控件右上角横向半径private int rightTopRadiusX;// 控件右上角纵向半径private int rightTopRadiusY;// 控件左下角横向半径private int leftBottomRadiusX;// 控件左下角纵向半径private int leftBottomRadiusY;// 控件右下角横向半径private int rightBottomRadiusX;// 控件右下角纵向半径private int rightBottomRadiusY;// 按下时的圆圈半径private int touchRadius;public DiffusionButton(Context context) {super(context, null);}public DiffusionButton(Context context, AttributeSet attrs) {this(context, attrs, R.attr.buttonStyle);}public DiffusionButton(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.DiffusionButton);speed = array.getInt(R.styleable.DiffusionButton_speed, 25);diffusionColor = array.getColor(R.styleable.DiffusionButton_diffusionColor, Color.parseColor("#30000000"));radius = array.getDimensionPixelSize(R.styleable.DiffusionButton_radius, 0);leftTopRadiusX = array.getDimensionPixelSize(R.styleable.DiffusionButton_leftTopRadiusX, radius);leftTopRadiusY = array.getDimensionPixelSize(R.styleable.DiffusionButton_leftTopRadiusY, radius);leftBottomRadiusX = array.getDimensionPixelSize(R.styleable.DiffusionButton_leftBottomRadiusX, radius);leftBottomRadiusY = array.getDimensionPixelSize(R.styleable.DiffusionButton_leftBottomRadiusY, radius);rightTopRadiusX = array.getDimensionPixelSize(R.styleable.DiffusionButton_rightTopRadiusX, radius);rightTopRadiusY = array.getDimensionPixelSize(R.styleable.DiffusionButton_rightTopRadiusY, radius);rightBottomRadiusX = array.getDimensionPixelSize(R.styleable.DiffusionButton_rightBottomRadiusX, radius);rightBottomRadiusY = array.getDimensionPixelSize(R.styleable.DiffusionButton_rightBottomRadiusY, radius);touchRadius = array.getDimensionPixelSize(R.styleable.DiffusionButton_touchRadius, dp2px(20));array.recycle();init(context);}/*** 初始化方法** @param context*/private void init(Context context) {this.context = context;paint = new Paint();paint.setColor(diffusionColor);path = new Path();}/*** 构造剪裁路径方法*/private void buildPath() {if (path == null) {return;}path.reset();path.addRoundRect(roundRect, new float[]{leftTopRadiusX, leftTopRadiusY,rightTopRadiusX, rightTopRadiusY,rightBottomRadiusX, rightBottomRadiusY,leftBottomRadiusX, leftBottomRadiusY,}, Path.Direction.CCW);}/*** 扩散动画完成后重置方法*/private void resetData() {isPushButton = false;isClickFinish = false;currentRadius = touchRadius;invalidate();}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {super.onLayout(changed, l, t, r, b);width = getMeasuredWidth();height = getMeasuredHeight();roundRect = new RectF(0, 0, width, height);buildPath();isInit = true;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (!isPushButton && !isClickFinish) {return;}// 剪裁显示区域canvas.clipPath(path);if (isClickFinish) {// 绘制扩散圆canvas.drawCircle(touchX, touchY, currentRadius, paint);if (currentRadius < maxRadius) {currentRadius += speed;postInvalidateDelayed(invalidateInterval);} else {resetData();}}if (isPushButton) {// 绘制点击圆canvas.drawCircle(touchX, touchY, touchRadius, paint);}}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:touchX = (int) event.getX();touchY = (int) event.getY();isPushButton = true;invalidate();break;case MotionEvent.ACTION_MOVE:touchX = (int) event.getX();touchY = (int) event.getY();invalidate();break;case MotionEvent.ACTION_UP:if (touchX > 0 && touchY > 0 && touchX < width && touchY < height) {isPushButton = false;isClickFinish = true;// 计算最大扩散半径maxRadius = (int) Math.max(Math.max(getDistance(touchX, touchY, 0, 0), getDistance(touchX, touchY, 0, height)),Math.max(getDistance(touchX, touchY, width, 0), getDistance(touchX, touchY, width, height)));currentRadius = touchRadius;postInvalidateDelayed(invalidateInterval);} else {resetData();}break;}return super.onTouchEvent(event);}private double getDistance(int x1, int y1, int x2, int y2) {return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));}/*** 设置扩散速度** @param speed*/public void setSpeed(int speed) {this.speed = speed;}/*** 设置扩散颜色** @param diffusionColor*/public void setDiffusionColor(int diffusionColor) {this.diffusionColor = diffusionColor;if (paint != null) {paint.setColor(diffusionColor);}}/*** 设置控件圆角半径** @param radius 半径,单位dp*/public void setRadius(int radius) {if (radius >= 0) {this.radius = dp2px(radius);leftTopRadiusX = radius;leftTopRadiusY = radius;rightTopRadiusX = radius;rightTopRadiusY = radius;leftBottomRadiusX = radius;leftBottomRadiusY = radius;rightBottomRadiusX = radius;rightBottomRadiusY = radius;if (isInit) {buildPath();}}}/*** 设置控件圆角半径* <p>* 参数为四个数组,分别对应控件左上角横纵向半径、右上角横纵向半径、左下角横纵向半径、右下角横纵向半径** @param leftTopRadius     半径,单位dp,下同* @param rightTopRadius* @param leftBottomRadius* @param rightBottomRadius*/public void setRadius(int[] leftTopRadius, int[] rightTopRadius, int[] leftBottomRadius, int[] rightBottomRadius) {leftTopRadiusX = dp2px(leftTopRadius[0]);leftTopRadiusY = dp2px(leftTopRadius[1]);rightTopRadiusX = dp2px(rightTopRadius[0]);rightTopRadiusY = dp2px(rightTopRadius[1]);leftBottomRadiusX = dp2px(leftBottomRadius[0]);leftBottomRadiusY = dp2px(leftBottomRadius[1]);rightBottomRadiusX = dp2px(rightBottomRadius[0]);rightBottomRadiusY = dp2px(rightBottomRadius[1]);if (isInit) {buildPath();}}/*** 设置按下时的圆圈半径** @param touchRadius 半径,单位dp*/public void setTouchRadius(int touchRadius) {this.touchRadius = dp2px(touchRadius);}private int dp2px(int dpVal) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, getResources().getDisplayMetrics());}
}

布局类 DiffusionLayout.java

public class DiffusionLayout extends LinearLayout {private Context context;private Paint paint;private Path path;private RectF roundRect;private int width;private int height;private int touchX;private int touchY;private int maxRadius;private int currentRadius;private int invalidateInterval = 10;private boolean isPushButton;private boolean isClickFinish;private boolean isInit;/*** 可设置参数*/// 扩散速度private int speed;// 扩散颜色private int diffusionColor;// 控件圆角半径private int radius;// 控件左上角横向半径private int leftTopRadiusX;// 控件左上角纵向半径private int leftTopRadiusY;// 控件右上角横向半径private int rightTopRadiusX;// 控件右上角纵向半径private int rightTopRadiusY;// 控件左下角横向半径private int leftBottomRadiusX;// 控件左下角纵向半径private int leftBottomRadiusY;// 控件右下角横向半径private int rightBottomRadiusX;// 控件右下角纵向半径private int rightBottomRadiusY;// 按下时的圆圈半径private int touchRadius;public DiffusionLayout(Context context) {this(context, null);}public DiffusionLayout(Context context, AttributeSet attrs) {this(context, attrs, -1);}public DiffusionLayout(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.DiffusionLayout);speed = array.getInt(R.styleable.DiffusionButton_speed, 25);diffusionColor = array.getColor(R.styleable.DiffusionButton_diffusionColor, Color.parseColor("#30000000"));radius = array.getDimensionPixelSize(R.styleable.DiffusionButton_radius, 0);leftTopRadiusX = array.getDimensionPixelSize(R.styleable.DiffusionButton_leftTopRadiusX, radius);leftTopRadiusY = array.getDimensionPixelSize(R.styleable.DiffusionButton_leftTopRadiusY, radius);leftBottomRadiusX = array.getDimensionPixelSize(R.styleable.DiffusionButton_leftBottomRadiusX, radius);leftBottomRadiusY = array.getDimensionPixelSize(R.styleable.DiffusionButton_leftBottomRadiusY, radius);rightTopRadiusX = array.getDimensionPixelSize(R.styleable.DiffusionButton_rightTopRadiusX, radius);rightTopRadiusY = array.getDimensionPixelSize(R.styleable.DiffusionButton_rightTopRadiusY, radius);rightBottomRadiusX = array.getDimensionPixelSize(R.styleable.DiffusionButton_rightBottomRadiusX, radius);rightBottomRadiusY = array.getDimensionPixelSize(R.styleable.DiffusionButton_rightBottomRadiusY, radius);touchRadius = array.getDimensionPixelSize(R.styleable.DiffusionButton_touchRadius, dp2px(20));array.recycle();init(context);}/*** 初始化方法** @param context*/private void init(Context context) {this.context = context;paint = new Paint();paint.setColor(diffusionColor);path = new Path();setWillNotDraw(false);setClickable(true);}/*** 构造剪裁路径方法*/private void buildPath() {if (path == null) {return;}path.reset();path.addRoundRect(roundRect, new float[]{leftTopRadiusX, leftTopRadiusY,rightTopRadiusX, rightTopRadiusY,rightBottomRadiusX, rightBottomRadiusY,leftBottomRadiusX, leftBottomRadiusY,}, Path.Direction.CCW);}/*** 扩散动画完成后重置方法*/private void resetData() {isPushButton = false;isClickFinish = false;currentRadius = touchRadius;invalidate();}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {super.onLayout(changed, l, t, r, b);width = getMeasuredWidth();height = getMeasuredHeight();roundRect = new RectF(0, 0, width, height);buildPath();isInit = true;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (!isPushButton && !isClickFinish) {return;}// 剪裁显示区域canvas.clipPath(path);if (isClickFinish) {// 绘制扩散圆canvas.drawCircle(touchX, touchY, currentRadius, paint);if (currentRadius < maxRadius) {currentRadius += speed;postInvalidateDelayed(invalidateInterval);} else {resetData();}}if (isPushButton) {// 绘制点击圆canvas.drawCircle(touchX, touchY, touchRadius, paint);}}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:touchX = (int) event.getX();touchY = (int) event.getY();isPushButton = true;invalidate();break;case MotionEvent.ACTION_MOVE:touchX = (int) event.getX();touchY = (int) event.getY();invalidate();break;case MotionEvent.ACTION_UP:if (touchX > 0 && touchY > 0 && touchX < width && touchY < height) {isPushButton = false;isClickFinish = true;// 计算最大扩散半径maxRadius = (int) Math.max(Math.max(getDistance(touchX, touchY, 0, 0), getDistance(touchX, touchY, 0, height)),Math.max(getDistance(touchX, touchY, width, 0), getDistance(touchX, touchY, width, height)));currentRadius = touchRadius;postInvalidateDelayed(invalidateInterval);} else {resetData();}break;}return super.onTouchEvent(event);}private double getDistance(int x1, int y1, int x2, int y2) {return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));}/*** 设置扩散速度** @param speed*/public void setSpeed(int speed) {this.speed = speed;}/*** 设置扩散颜色** @param diffusionColor*/public void setDiffusionColor(int diffusionColor) {this.diffusionColor = diffusionColor;if (paint != null) {paint.setColor(diffusionColor);}}/*** 设置控件圆角半径** @param radius 半径,单位dp*/public void setRadius(int radius) {if (radius >= 0) {this.radius = dp2px(radius);leftTopRadiusX = radius;leftTopRadiusY = radius;rightTopRadiusX = radius;rightTopRadiusY = radius;leftBottomRadiusX = radius;leftBottomRadiusY = radius;rightBottomRadiusX = radius;rightBottomRadiusY = radius;if (isInit) {buildPath();}}}/*** 设置控件圆角半径* <p>* 参数为四个数组,分别对应控件左上角横纵向半径、右上角横纵向半径、左下角横纵向半径、右下角横纵向半径** @param leftTopRadius     半径,单位dp,下同* @param rightTopRadius* @param leftBottomRadius* @param rightBottomRadius*/public void setRadius(int[] leftTopRadius, int[] rightTopRadius, int[] leftBottomRadius, int[] rightBottomRadius) {leftTopRadiusX = dp2px(leftTopRadius[0]);leftTopRadiusY = dp2px(leftTopRadius[1]);rightTopRadiusX = dp2px(rightTopRadius[0]);rightTopRadiusY = dp2px(rightTopRadius[1]);leftBottomRadiusX = dp2px(leftBottomRadius[0]);leftBottomRadiusY = dp2px(leftBottomRadius[1]);rightBottomRadiusX = dp2px(rightBottomRadius[0]);rightBottomRadiusY = dp2px(rightBottomRadius[1]);if (isInit) {buildPath();}}/*** 设置按下时的圆圈半径** @param touchRadius 半径,单位dp*/public void setTouchRadius(int touchRadius) {this.touchRadius = dp2px(touchRadius);}private int dp2px(int dpVal) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, getResources().getDisplayMetrics());}
}

控件有两个,DiffusionButton和DiffusionLayout,分别应对点击按钮和点击布局的使用场景。DiffusionButton继承自Button,DiffusionLayout继承自LinearLayout,像使用普通的Button和Layout来使用它们就可以了。

像下面这样:

<com.min.diffusionbutton.view.DiffusionButtonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="50dp"android:layout_margin="15dp"android:background="@drawable/button_red_up"android:text="Button"android:textColor="#ffffff"android:textSize="16dp"app:radius="25dp" /><com.min.diffusionbutton.view.DiffusionLayoutandroid:id="@+id/layout"android:layout_width="350dp"android:layout_height="350dp"android:layout_margin="15dp"android:background="@drawable/button_red_up"app:radius="40dp"app:touchRadius="40dp" />

运行一下就能看到开头的效果了。

当然控件还支持一些自定义属性设置,各个属性的意义在源码注释里已经写的很清楚了,这里不再赘述。


最后附上源码地址:https://download.csdn.net/download/Sure_Min/12565978

 

这次的内容就到这里,我们下次再见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/45517.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 按钮水波纹效果【背景色】

两种方式实现&#xff1a; 第一种&#xff1a;Material自带水波纹 通过如下代码设置波纹的背景&#xff1a; android:background"?android:attr/selectableItemBackground"波纹有边界【一般这种好看点&#xff0c;大多数也都是这种】 android:foreground"?…

Android 水波纹扩散效果

项目地址下载&#xff1a;https://github.com/LiuJunb/RippleImageView 1.效果图&#xff1a; 2.使用方法&#xff1a; 在xml里使用RippleImageView自定义控件&#xff1a; xmlns:app"http://schemas.android.com/apk/res-auto"<com.army.rippleimage.RippleIma…

Android 自定义view实现水波纹效果

http://blog.csdn.net/tianjian4592/article/details/44222565 在实际的开发中&#xff0c;很多时候还会遇到相对比较复杂的需求&#xff0c;比如产品妹纸或UI妹纸在哪看了个让人兴奋的效果&#xff0c;兴致高昂的来找你&#xff0c;看了之后目的很明确&#xff0c;当然就是希望…

Android点击Button水波纹效果

先上图&#xff0c;看看接下来我要向大家介绍的是个什么东西&#xff0c;如下图&#xff1a; 接下来要介绍的就是如何实现上述图中的波纹效果&#xff0c;这种效果如果大家没有体验过的话&#xff0c;可以看看百度手机卫士或者360手机卫士&#xff0c;里面的按钮点击效果都是…

unity 实现水的波纹效果

之前的实现过这个效果&#xff0c;可惜没有记笔记&#xff0c;所以现在有点遗忘&#xff0c;连多个波纹一起在水面上实现的效果都忘记了&#xff0c;所以&#xff0c;查看了下之前实现的代码&#xff0c;现在再记一下笔记。 基础的波纹效果 要实现波纹&#xff0c;首先要知道…

Android水波纹效果

日常的Android开发中可能大家都见过类似这种水波纹展开的效果&#xff0c;比如加载一张图片的时候使用水波纹加载&#xff0c;其实这种实现非常简单。因为Google已经为我们提供了一个非常方便地工具类 ViewAnimationUtils 它的实现非常简单&#xff0c;就这个类&#xff0c;其…

自定义view实现水波纹效果

我正在参加 CSDN 2015博客之星评选 感恩分享活动&#xff0c;如果觉得文章还不错&#xff0c;请投个票鼓励下吧&#xff1a;http://vote.blog.csdn.net/blogstar2015/candidate?usernametianjian4592 在实际的开发中&#xff0c;很多时候还会遇到相对比较复杂的需求&#xf…

Android L中水波纹点击效果的实现

博主参加了2014 CSDN博客之星评选&#xff0c;帮我投一票吧。 点击给我投票 前言 前段时间android L&#xff08;android 5.0&#xff09;出来了&#xff0c;界面上做了一些改动&#xff0c;主要是添加了若干动画和一些新的控件&#xff0c;相信大家对view的点击效果-水波纹很…

科技云报道:垂直大模型竞争,能突破数据“卡点”吗?

科技云报道原创。 AI大模型火遍全球&#xff0c;中国产业也激发了对人工智能应用的新热情。 随着各大厂商参与竞逐&#xff0c;市场正在分化为通用与垂直两大路径&#xff0c;两者在参数级别、应用场景、商业模式等方面差异已逐步显现。 企业涌入垂直大模型赛道 通用AI大模型…

【人工智能】论未来人工智能的大模型生态:重塑技术前景与应用

目录 未来人工智能大模型生态:重塑技术前景与应用 引言 OpenAI 的 AGI 愿景

创造之境:Stable Diffusion + chatGPT下的自动绘图探索

什么是Stable Diffusion Stable Diffusion 是在2022年发布的深度学习文本到图像生成模型。它主要用于根据文字的描述生成详细图像&#xff0c;尽管它也可以应用于其他任务&#xff0c;如内插绘制、外插绘制&#xff0c;以及在提示词&#xff08;英语&#xff09;指导下生成图生…

工具 | ChatPDF:与PDF对话!

工具 | ChatPDF&#xff1a;与PDF对话&#xff01; 本文首发微信公众号&#xff1a;全副武装的大师兄 ChatPDF是什么&#xff1f; 它是一个在不到一周时间里&#xff0c;就让10万份PDF学会了聊天的应用&#xff01;无需注册&#xff0c;登录&#xff0c;通过上传PDF文件到Ch…

微信公众号 接口配置

1、登录微信公众平台-->设置与开发-->基本配置页面&#xff0c;打开服务器配置 2、在网站后台添加两个接口get请求验证和post请求消息转发&#xff0c;url为上图填写的url&#xff0c; RestController RequestMapping("/officialAccount/") public class Offic…

亚马逊评论和销量的关系都有哪些呢?

评论和销量的关系非常密切。当然不是评论越多越好&#xff0c;更合理的评论对产品的关键词排名帮助更大。就连亚马逊也会推荐一些资源&#xff0c;所以推荐和曝光越多&#xff0c;销量也会增加越多。这也是为什么卖家都在努力增加Review数量&#xff0c;甚至花钱找人做评测还免…

亚马逊评论的类型有哪些?都该怎么操作呢?

亚马逊评论对于亚马逊卖家店铺来说很重要的&#xff0c;评论又多又好的产品自然更受欢迎&#xff0c;但是评论肯定不只一种&#xff0c;那么亚马逊评论的类型有哪些&#xff1f;都该怎么操作呢&#xff1f; 亚马逊评论分为以下几种&#xff1a; 1、直评 直评是买家可以不用购…

视频会议解决方案-最新全套文件

视频会议解决方案-最新全套文件 一、建设背景二、建设思路业务挑战 三、建设方案四、获取 - 视频会议全套最新解决方案合集 一、建设背景 随着中国经济的迅速发展&#xff0c;很多企业的发展也进入快车道&#xff0c;分支机构越来越多&#xff0c;形成了遍布全国范围甚至全球范…

微软:明年 7 月之前,所有会议线上举行

By 超神经 内容提要&#xff1a;这场疫情对科技行业带来了重大影响。自 2 月以来&#xff0c;被迫取消或转至线上的科技峰会已经数不胜数。现在&#xff0c;微软已经决定&#xff0c;将明年下半年之前的所有活动转至线上&#xff0c;科技会议或许就此迎来变革&#xff1f; 关键…

智能会议纪要生成,从音视频到一键生成会议特征数据

★★★ 本文源自AI Studio社区精品项目&#xff0c;【点击此处】查看更多精品内容 >>> 零.项目背景 目标&#xff1a;针对会议场景的长视频或者长语音&#xff0c;自动生成会议记录并通过摘要生成技术形成会议摘要。 一.技术流程 1.通过moviepy 提取视频中的音频&am…

本地电脑腾讯会议PPT演讲者模式

在腾讯会议中进行PPT汇报的时候&#xff0c;有些情况我们是想要看到备注的&#xff0c;即如何实现对自己是演讲者模式&#xff0c;而对其他人展示的是报告全屏内容呢&#xff1f; 不同操作系统的电脑实现方式还不同&#xff0c;下面分别介绍&#xff1a; 对于mac系统&#xf…

会中切换网络总掉线?腾讯会议用这种方案让你好好开会

&#x1f449;腾小云导读 也许你有这样的体验&#xff1a;当你加入腾讯会议开会&#xff0c;老板正在发布重要任务时&#xff0c;你恰好要进电梯时 wifi 切换成了 cellular&#xff0c;画面开始「转菊花」&#xff0c;网络断开重连却需要好久&#xff0c;最终老板的指示你一个字…