日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android动画view上移,在Android开发中使用View制作一个引导动画

發布時間:2025/3/12 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android动画view上移,在Android开发中使用View制作一个引导动画 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Android開發中使用View制作一個引導動畫

發布時間:2020-11-20 16:46:16

來源:億速云

閱讀:98

作者:Leah

這篇文章將為大家詳細講解有關在Android開發中使用View制作一個引導動畫,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

一、實現效果圖

關于貝塞爾曲線

二、實現代碼

1.自定義view

package com.czhappy.showintroduce.view;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Path;

import android.util.AttributeSet;

import android.view.View;

import android.widget.RelativeLayout;

/**

* Description: 水波紋動畫引導view

* User: chenzheng

* Date: 2017/1/14 0014

* Time: 18:01

*/

public class RippleIntroView extends RelativeLayout implements Runnable {

private int mMaxRadius = 70;

private int mInterval = 20;

private int count = 0;

private Bitmap mCacheBitmap;

private Paint mRipplePaint;

private Paint mCirclePaint;

private Path mArcPath;

public RippleIntroView(Context context) {

this(context, null);

}

public RippleIntroView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public RippleIntroView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init();

}

private void init() {

mRipplePaint = new Paint();

mRipplePaint.setAntiAlias(true);

mRipplePaint.setStyle(Paint.Style.STROKE);

mRipplePaint.setColor(Color.WHITE);

mRipplePaint.setStrokeWidth(2.f);

mCirclePaint = new Paint();

mCirclePaint.setAntiAlias(true);

mCirclePaint.setStyle(Paint.Style.FILL);

mCirclePaint.setColor(Color.WHITE);

mArcPath = new Path();

}

/**

* view大小變化時系統調用

* @param w

* @param h

* @param oldw

* @param oldh

*/

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

if (mCacheBitmap != null) {

mCacheBitmap.recycle();

mCacheBitmap = null;

}

}

@Override

protected void onDraw(Canvas canvas) {

//獲取加號圖片view

View mPlusChild = getChildAt(0);

//獲取提示圖片view

View mRefsChild = getChildAt(1);

if (mPlusChild == null || mRefsChild == null) return;

//獲取加號圖片大小

final int pw = mPlusChild.getWidth();

final int ph = mPlusChild.getHeight();

//獲取提示圖片大小

final int fw = mRefsChild.getWidth();

final int fh = mRefsChild.getHeight();

if (pw == 0 || ph == 0) return;

//加號圖片中心點坐標

final float px = mPlusChild.getX() + pw / 2;

final float py = mPlusChild.getY() + ph / 2;

//提示圖片左上角坐標

final float fx = mRefsChild.getX();

final float fy = mRefsChild.getY();

final int rw = pw / 2;

final int rh = ph / 2;

if (mCacheBitmap == null) {

mCacheBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);

Canvas cv = new Canvas(mCacheBitmap);

super.onDraw(cv);

//清空所有已經畫過的path至原始狀態

mArcPath.reset();

//起始輪廓點移至x,y坐標點,即加號圖片正下方再往下20位置

mArcPath.moveTo(px, py + rh + mInterval);

//設置二次貝塞爾,實現平滑曲線,前兩個參數為操作點坐標,后兩個參數為結束點坐標

mArcPath.quadTo(px, fy - mInterval, fx + fw * 0.618f, fy - mInterval);

//0~255,數值越小越透明

mRipplePaint.setAlpha(255);

cv.drawPath(mArcPath, mRipplePaint);

//繪制半徑為6的實心圓點

cv.drawCircle(px, py + rh + mInterval, 6, mCirclePaint);

}

//繪制背景圖片

canvas.drawBitmap(mCacheBitmap, 0, 0, mCirclePaint);

//保存畫布當前的狀態

int save = canvas.save();

for (int step = count; step <= mMaxRadius; step += mInterval) {

//step越大越靠外就越透明

mRipplePaint.setAlpha(255 * (mMaxRadius - step) / mMaxRadius);

canvas.drawCircle(px, py, (float) (rw + step), mRipplePaint);

}

//恢復Canvas的狀態

canvas.restoreToCount(save);

//延遲80毫秒后開始運行

postDelayed(this, 80);

}

@Override

public void run() {

//把run對象的引用從隊列里拿出來,這樣,他就不會執行了,但 run 沒有銷毀

removeCallbacks(this);

count += 2;

count %= mInterval;

invalidate();//重繪

}

/**

* 銷毀view時調用,收尾工作

*/

@Override

protected void onDetachedFromWindow() {

super.onDetachedFromWindow();

if (mCacheBitmap != null) {

mCacheBitmap.recycle();

mCacheBitmap = null;

}

}

}

2.MainActivity.java

package com.czhappy.showintroduce.activity;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.view.View;

import android.view.ViewGroup;

import com.czhappy.showintroduce.R;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

View view = findViewById(R.id.layout_ripple);

view.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

((ViewGroup) v.getParent()).removeView(v);

}

});

}

}

3.activity_main.xml

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello World!" />

android:id="@+id/layout_ripple"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:clickable="true"

android:fitsSystemWindows="true"

android:background="#AA000000">

android:id="@+id/iv_plus"

android:layout_marginTop="36dp"

android:src="@mipmap/ic_add"

android:layout_alignParentRight="true"

android:layout_marginRight="6dp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

android:src="@mipmap/tips_subscribe"

android:id="@+id/tv_title"

android:layout_below="@id/iv_plus"

android:layout_marginTop="50dp"

android:layout_alignParentRight="true"

android:layout_marginRight="40dp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

關于在Android開發中使用View制作一個引導動畫就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

總結

以上是生活随笔為你收集整理的android动画view上移,在Android开发中使用View制作一个引导动画的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。