安卓5.1怎么有的控件有涟漪效果

安卓5.1怎么有的控件有涟漪效果,第1张

最近发现了一款可以为控件增加涟漪效果的github项目,可以提升应用的逼格啊,大家不妨引入到自己的项目中。该项目本身是android studio下面编译,我改成了eclipse下可以运行的项目,下面我们来看一下具体的用法吧!

1.RippleView.java:

package com.example.rippleeffectview

import com.example.test.R

import android.content.Context

import android.content.res.TypedArray

import android.graphics.Bitmap

import android.graphics.Canvas

import android.graphics.Paint

import android.graphics.PorterDuff

import android.graphics.PorterDuffXfermode

import android.graphics.Rect

import android.os.Handler

import android.util.AttributeSet

import android.view.GestureDetector

import android.view.MotionEvent

import android.view.View

import android.view.ViewGroup

import android.view.animation.Animation

import android.view.animation.ScaleAnimation

import android.widget.RelativeLayout

/**

*

* Date : 10/8/2014

*/

public class RippleView extends RelativeLayout

{

private int WIDTH

private int HEIGHT

private int FRAME_RATE = 10

private int DURATION = 400

private int PAINT_ALPHA = 90

private Handler canvasHandler

private float radiusMax = 0

private boolean animationRunning = false

private int timer = 0

private int timerEmpty = 0

private int durationEmpty = -1

private float x = -1

private float y = -1

private int zoomDuration

private float zoomScale

private ScaleAnimation scaleAnimation

private Boolean hasToZoom

private Boolean isCentered

private Integer rippleType

private Paint paint

private Bitmap originBitmap

private int rippleColor

private View childView

private int ripplePadding

private GestureDetector gestureDetector

private Runnable runnable = new Runnable()

{

@Override

public void run()

{

invalidate()

}

}

public RippleView(Context context)

{

super(context)

}

public RippleView(Context context, AttributeSet attrs)

{

super(context, attrs)

init(context, attrs)

}

public RippleView(Context context, AttributeSet attrs, int defStyle)

{

super(context, attrs, defStyle)

init(context, attrs)

}

private void init(final Context context, final AttributeSet attrs)

{

if (isInEditMode())

return

final TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RippleView)

rippleColor = typedArray.getColor(R.styleable.RippleView_rv_color, getResources().getColor(R.color.rippelColor))

rippleType = typedArray.getInt(R.styleable.RippleView_rv_type, 0)

hasToZoom = typedArray.getBoolean(R.styleable.RippleView_rv_zoom, false)

isCentered = typedArray.getBoolean(R.styleable.RippleView_rv_centered, false)

DURATION = typedArray.getInteger(R.styleable.RippleView_rv_rippleDuration, DURATION)

FRAME_RATE = typedArray.getInteger(R.styleable.RippleView_rv_framerate, FRAME_RATE)

PAINT_ALPHA = typedArray.getInteger(R.styleable.RippleView_rv_alpha, PAINT_ALPHA)

ripplePadding = typedArray.getDimensionPixelSize(R.styleable.RippleView_rv_ripplePadding, 0)

canvasHandler = new Handler()

zoomScale = typedArray.getFloat(R.styleable.RippleView_rv_zoomScale, 1.03f)

zoomDuration = typedArray.getInt(R.styleable.RippleView_rv_zoomDuration, 200)

paint = new Paint()

paint.setAntiAlias(true)

paint.setStyle(Paint.Style.FILL)

paint.setColor(rippleColor)

paint.setAlpha(PAINT_ALPHA)

this.setWillNotDraw(false)

gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener()

{

@Override

public boolean onSingleTapConfirmed(MotionEvent e)

{

return true

}

@Override

public boolean onSingleTapUp(MotionEvent e)

{

return true

}

})

this.setDrawingCacheEnabled(true)

}

@Override

public void addView(View child, int index, ViewGroup.LayoutParams params)

{

childView = child

super.addView(child, index, params)

}

@Override

public void draw(Canvas canvas)

{

super.draw(canvas)

if (animationRunning)

{

if (DURATION <= timer * FRAME_RATE)

{

animationRunning = false

timer = 0

durationEmpty = -1

timerEmpty = 0

canvas.restore()

invalidate()

return

}

else

canvasHandler.postDelayed(runnable, FRAME_RATE)

if (timer == 0)

canvas.save()

canvas.drawCircle(x, y, (radiusMax * (((float) timer * FRAME_RATE) / DURATION)), paint)

paint.setColor(getResources().getColor(android.R.color.holo_red_light))

if (rippleType == 1 &&originBitmap != null &&(((float) timer * FRAME_RATE) / DURATION) >0.4f)

{

if (durationEmpty == -1)

durationEmpty = DURATION - timer * FRAME_RATE

timerEmpty++

final Bitmap tmpBitmap = getCircleBitmap((int) ((radiusMax) * (((float) timerEmpty * FRAME_RATE) / (durationEmpty))))

canvas.drawBitmap(tmpBitmap, 0, 0, paint)

tmpBitmap.recycle()

}

paint.setColor(rippleColor)

if (rippleType == 1)

{

if ((((float) timer * FRAME_RATE) / DURATION) >0.6f)

paint.setAlpha((int) (PAINT_ALPHA - ((PAINT_ALPHA) * (((float) timerEmpty * FRAME_RATE) / (durationEmpty)))))

else

paint.setAlpha(PAINT_ALPHA)

}

else

paint.setAlpha((int) (PAINT_ALPHA - ((PAINT_ALPHA) * (((float) timer * FRAME_RATE) / DURATION))))

timer++

}

}

@Override

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

{

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

WIDTH = w

HEIGHT = h

scaleAnimation = new ScaleAnimation(1.0f, zoomScale, 1.0f, zoomScale, w / 2, h / 2)

scaleAnimation.setDuration(zoomDuration)

scaleAnimation.setRepeatMode(Animation.REVERSE)

scaleAnimation.setRepeatCount(1)

}

@Override

public boolean onTouchEvent(MotionEvent event)

{

if (gestureDetector.onTouchEvent(event) &&!animationRunning)

{

if (hasToZoom)

this.startAnimation(scaleAnimation)

radiusMax = Math.max(WIDTH, HEIGHT)

if (rippleType != 2)

radiusMax /= 2

radiusMax -= ripplePadding

if (isCentered || rippleType == 1)

{

this.x = getMeasuredWidth() / 2

this.y = getMeasuredHeight() / 2

}

else

{

this.x = event.getX()

this.y = event.getY()

}

animationRunning = true

if (rippleType == 1 &&originBitmap == null)

originBitmap = getDrawingCache(true)

invalidate()

this.performClick()

}

childView.onTouchEvent(event)

return true

}

@Override

public boolean onInterceptTouchEvent(MotionEvent event)

{

return true

}

private Bitmap getCircleBitmap(final int radius) {

final Bitmap output = Bitmap.createBitmap(originBitmap.getWidth(), originBitmap.getHeight(), Bitmap.Config.ARGB_8888)

final Canvas canvas = new Canvas(output)

final Paint paint = new Paint()

final Rect rect = new Rect((int)(x - radius), (int)(y - radius), (int)(x + radius), (int)(y + radius))

paint.setAntiAlias(true)

canvas.drawARGB(0, 0, 0, 0)

canvas.drawCircle(x, y, radius, paint)

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN))

canvas.drawBitmap(originBitmap, rect, rect, paint)

return output

}

}

2.MainActivity.java:

package com.example.test

import com.example.rippleeffectview.RippleView

import android.os.Bundle

import android.support.v7.app.ActionBarActivity

import android.view.Menu

import android.view.MenuItem

public class MainActivity extends ActionBarActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

final RippleView rippleView = (RippleView) findViewById(R.id.more)

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menuthis adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu)

return true

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will

// automatically handle clicks on the Home/Up button, so long

// as you specify a parent activity in AndroidManifest.xml.

int id = item.getItemId()

if (id == R.id.action_settings) {

return true

}

return super.onOptionsItemSelected(item)

}

}

3.布局文件应该是需要注意的地方:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:ripple="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent" >

<com.example.rippleeffectview.RippleView

android:id="@+id/more"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_margin="5dp"

ripple:rv_centered="true"

ripple:rv_type="rectangle" >

<Button

android:layout_width="match_parent"

android:layout_height="80dp"

android:background="@color/switch_thumb_normal_material_dark"

android:text="I like Color" />

</com.example.rippleeffectview.RippleView>

</RelativeLayout>

您好:

根据您的描述,建议您触摸手机应用程序-设定-我的设备-锁定屏幕-解锁效果,进入后选择涟漪效果尝试。欢迎您访问三星数字服务平台:http://support.samsung.com.cn/ask


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/bake/11923371.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存