亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android實現水波紋特效的方法

發布時間:2021-04-16 11:04:26 來源:億速云 閱讀:257 作者:小新 欄目:移動開發

這篇文章將為大家詳細講解有關Android實現水波紋特效的方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Android原生的技術利用動畫或者自定義控件都可以實現,下面上個圖類似于這樣的效果

Android實現水波紋特效的方法

下面請看第一種動畫實現,這種方式較為簡單些,就是利用3個ImageView不斷地做縮放和漸變的動畫。

布局文件定義一下

<RelativeLayout
  android:id="@+id/rl"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:gravity="center"
  android:layout_marginBottom="160dp">
  <!--中心imageView-->
  <ImageView
    android:id="@+id/iv_wave"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_centerHorizontal="true"
    android:background="@drawable/shape_circle" />
  <!--中間的imageView-->
  <ImageView
    android:id="@+id/iv_wave_1"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_centerHorizontal="true"
    android:background="@drawable/shape_circle" />
  <!--最外層imageView-->
  <ImageView
    android:id="@+id/iv_wave_2"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_centerHorizontal="true"
    android:background="@drawable/shape_circle" />
</RelativeLayout>

接下來中間的ImageView保持不變,通過操作另外兩個ImageView達到效果

private void setAnim1() {
  AnimationSet as = new AnimationSet(true);
  //縮放動畫,以中心從原始放大到1.4倍
  ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 1.4f, 1.0f, 1.4f,
      ScaleAnimation.RELATIVE_TO_SELF, 0.5f,
      ScaleAnimation.RELATIVE_TO_SELF, 0.5f);
  //漸變動畫
  AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.5f);
  scaleAnimation.setDuration(800);
  scaleAnimation.setRepeatCount(Animation.INFINITE);
  alphaAnimation.setRepeatCount(Animation.INFINITE);
  as.setDuration(800);
  as.addAnimation(scaleAnimation);
  as.addAnimation(alphaAnimation);
  iv1.startAnimation(as);
}
private void setAnim2() {
  AnimationSet as = new AnimationSet(true);
  //縮放動畫,以中心從1.4倍放大到1.8倍
  ScaleAnimation scaleAnimation = new ScaleAnimation(1.4f, 1.8f, 1.4f, 1.8f,
      ScaleAnimation.RELATIVE_TO_SELF, 0.5f,
      ScaleAnimation.RELATIVE_TO_SELF, 0.5f);
  //漸變動畫
  AlphaAnimation alphaAnimation = new AlphaAnimation(0.5f, 0.1f);
  scaleAnimation.setDuration(800);
  scaleAnimation.setRepeatCount(Animation.INFINITE);
  alphaAnimation.setRepeatCount(Animation.INFINITE);
  as.setDuration(800);
  as.addAnimation(scaleAnimation);
  as.addAnimation(alphaAnimation);
  iv2.startAnimation(as);
}

接下來就是第二種自定義動畫實現

首先定義style文件自定義屬性--在values下創建attrs.xml文件

<declare-styleable name="SpreadView">
  <!--中心圓顏色-->
  <attr name="spread_center_color" format="color" />
  <!--中心圓半徑-->
  <attr name="spread_radius" format="integer" />
  <!--擴散圓顏色-->
  <attr name="spread_spread_color" format="color" />
  <!--擴散間距-->
  <attr name="spread_distance" format="integer" />
  <!--擴散最大半徑-->
  <attr name="spread_max_radius" format="integer" />
  <!--擴散延遲間隔-->
  <attr name="spread_delay_milliseconds" format="integer" />
</declare-styleable>

接下來創建SpreadView繼承view,初始化構造方法

public SpreadView(Context context) {
  this(context,null,0);
}
 
public SpreadView(Context context, @Nullable AttributeSet attrs) {
  this(context, attrs,0);
}
 
public SpreadView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SpreadView, defStyleAttr, 0);
  radius = a.getInt(R.styleable.SpreadView_spread_radius, radius);
  maxRadius = a.getInt(R.styleable.SpreadView_spread_max_radius, maxRadius);
  int centerColor = a.getColor(R.styleable.SpreadView_spread_center_color, ContextCompat.getColor(context, R.color.colorAccent));
  int spreadColor = a.getColor(R.styleable.SpreadView_spread_spread_color, ContextCompat.getColor(context, R.color.colorAccent));
  distance = a.getInt(R.styleable.SpreadView_spread_distance, distance);
  a.recycle();
  centerPaint = new Paint();
  centerPaint.setColor(centerColor);
  centerPaint.setAntiAlias(true);
  //最開始不透明且擴散距離為0
  alphas.add(255);
  spreadRadius.add(0);
  spreadPaint = new Paint();
  spreadPaint.setAntiAlias(true);
  spreadPaint.setAlpha(255);
  spreadPaint.setColor(spreadColor);
}

自定義View的繪制:

@Override
protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  for (int i = 0; i < spreadRadius.size(); i++) {
    int alpha = alphas.get(i);
    spreadPaint.setAlpha(alpha);
    int width = spreadRadius.get(i);
    //繪制擴散的圓
    canvas.drawCircle(centerX, centerY, radius + width, spreadPaint);
    //每次擴散圓半徑遞增,圓透明度遞減
    if (alpha > 0 && width < 300) {
      alpha = alpha - distance > 0 ? alpha - distance : 1;
      alphas.set(i, alpha);
      spreadRadius.set(i, width + distance);
    }
  }
  //當最外層擴散圓半徑達到最大半徑時添加新擴散圓
  if (spreadRadius.get(spreadRadius.size() - 1) > maxRadius) {
    spreadRadius.add(0);
    alphas.add(255);
  }
  //超過8個擴散圓,刪除最先繪制的圓,即最外層的圓
  if (spreadRadius.size() >= 8) {
    alphas.remove(0);
    spreadRadius.remove(0);
  }
  //中間的圓
  canvas.drawCircle(centerX, centerY, radius, centerPaint);
  //延遲更新,達到擴散視覺差效果
  postInvalidateDelayed(delayMilliseconds);
}

最后在activity的布局文件中引用自定義屬性:

<com.example.louliang.spread.SpreadView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  app:spread_center_color="@color/colorAccent"
  app:spread_delay_milliseconds="35"
  app:spread_distance="5"
  app:spread_max_radius="90"
  app:spread_radius="150"
  app:spread_spread_color="@color/colorAccent" />

關于“Android實現水波紋特效的方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

神农架林区| 栖霞市| 开化县| 瑞金市| 德令哈市| 布尔津县| 宜丰县| 温宿县| 宝清县| 廉江市| 子长县| 石家庄市| 陆河县| 涟源市| 玉树县| 互助| 镇江市| 南阳市| 张家港市| 河间市| 通河县| 金昌市| 宁晋县| 南木林县| 崇阳县| 绥化市| 镇宁| 武胜县| 常州市| 剑河县| 克东县| 巴楚县| 富裕县| 贵定县| 二连浩特市| 大同市| 安远县| 开平市| 平乐县| 调兵山市| 晋江市|