Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.49 KB | None | 0 0
  1. package com.sctdroid.app.uikit;
  2.  
  3. import android.animation.ValueAnimator;
  4. import android.graphics.Bitmap;
  5. import android.graphics.Canvas;
  6. import android.graphics.Color;
  7. import android.graphics.ColorFilter;
  8. import android.graphics.LinearGradient;
  9. import android.graphics.Paint;
  10. import android.graphics.Point;
  11. import android.graphics.PorterDuff;
  12. import android.graphics.PorterDuffXfermode;
  13. import android.graphics.Shader;
  14. import android.graphics.drawable.Animatable;
  15. import android.graphics.drawable.Drawable;
  16. import android.support.annotation.IntRange;
  17. import android.support.annotation.NonNull;
  18. import android.support.annotation.Nullable;
  19. import android.view.animation.AccelerateInterpolator;
  20. import android.view.animation.DecelerateInterpolator;
  21. import android.view.animation.Interpolator;
  22.  
  23. import java.util.ArrayList;
  24. import java.util.List;
  25.  
  26. /**
  27. * Created by lixindong on 6/27/17.
  28. */
  29.  
  30. public class Particle extends Drawable implements Animatable, ValueAnimator.AnimatorUpdateListener {
  31.  
  32. private Bitmap mBitmap;
  33. private ValueAnimator mAnimator;
  34.  
  35. private List<ValueAnimator> mParticleAnimators = new ArrayList<>();
  36. private int duration = 1000;
  37. private int drawnDuration = 500;
  38. private int randomDuration = 700;
  39.  
  40. public Particle(@NonNull Bitmap bitmap) {
  41. mBitmap = bitmap.copy(bitmap.getConfig(), true);
  42. pointPaint = new Paint();
  43. rectPaint = new Paint();
  44.  
  45. mAnimator = ValueAnimator.ofInt(0, mBitmap.getWidth());
  46. mAnimator.setDuration(2150);
  47. mAnimator.setInterpolator(new AccelerateInterpolator());
  48.  
  49. updateParticles();
  50. }
  51.  
  52. private List<ParticleElement> elements = new ArrayList<>();
  53.  
  54. int len = 16;
  55.  
  56. private void updateParticles() {
  57. elements.clear();
  58. for (int x = 0; x < mBitmap.getWidth(); x += len) {
  59. for (int y = 0; y < mBitmap.getHeight(); y += len) {
  60. int color = mBitmap.getPixel(x, y);
  61. int r = Color.red(color);
  62. int a = Color.alpha(color);
  63. int g = Color.green(color);
  64. int b = Color.blue(color);
  65. if (r >= 250 && g >= 250 && b >= 250) {
  66. continue;
  67. }
  68. int fixedX = (int) (x + (Math.random() - 0.5) * 30);
  69. int fixedY = (int) (y + (Math.random() - 0.5) * 30);
  70. elements.add(new ParticleElement(fixedX, fixedY, color));
  71. }
  72. }
  73. }
  74.  
  75. private Paint pointPaint;
  76. private Paint rectPaint;
  77.  
  78. @Override
  79. public void draw(@NonNull Canvas canvas) {
  80. canvas.save();
  81. canvas.clipRect(0, 0, clipWidth, canvas.getHeight());
  82. canvas.drawBitmap(mBitmap, 0, 0, null);
  83. LinearGradient gradient = new LinearGradient(0, 0, 100, 0, Color.TRANSPARENT, Color.WHITE, Shader.TileMode.CLAMP);
  84. rectPaint.setShader(gradient);
  85. rectPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN));
  86. canvas.save();
  87. canvas.translate(clipWidth - 100, 0);
  88. canvas.drawRect(0, 0, 100, canvas.getHeight(), rectPaint);
  89. canvas.restore();
  90. rectPaint.setXfermode(null);
  91. canvas.restore();
  92.  
  93. for (ParticleElement element : elements) {
  94. if (element.visible) {
  95. pointPaint.setColor(element.color);
  96. canvas.drawCircle(element.x, element.y, len / 4, pointPaint);
  97. }
  98. }
  99. }
  100.  
  101. @Override
  102. public int getIntrinsicWidth() {
  103. return mBitmap.getWidth();
  104. }
  105.  
  106. @Override
  107. public int getIntrinsicHeight() {
  108. return mBitmap.getHeight();
  109. }
  110.  
  111. @Override
  112. public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {
  113.  
  114. }
  115.  
  116. @Override
  117. public void setColorFilter(@Nullable ColorFilter colorFilter) {
  118.  
  119. }
  120.  
  121. @Override
  122. public int getOpacity() {
  123. return 0;
  124. }
  125.  
  126. Interpolator interpolator = new DecelerateInterpolator();
  127.  
  128. @Override
  129. public void start() {
  130. for (final ParticleElement element : elements) {
  131. final int controllerX = (int) (element.x + 300 * (Math.random() - 0.5));
  132. final int controllerY = (int) (element.y * Math.random());
  133. final int endX = element.x;
  134. final int endY = element.y;
  135.  
  136. final int startX = (int) (element.x + 100 * (Math.random() - 0.5));
  137. final int startY = 0;
  138.  
  139. ValueAnimator animator = ValueAnimator.ofInt(0, element.y);
  140. animator.setDuration(drawnDuration);
  141. animator.setStartDelay(2150 * element.x / getIntrinsicWidth() + (long) (Math.random() * randomDuration));
  142. animator.setInterpolator(interpolator);
  143. animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  144. @Override
  145. public void onAnimationUpdate(ValueAnimator animation) {
  146. if (animation.getAnimatedFraction() == 0) {
  147. element.visible = true;
  148. }
  149. Point point = bazic(startX, startY, controllerX, controllerY, endX, endY, animation.getAnimatedFraction());
  150. element.x = point.x;
  151. element.y = point.y;
  152. if (animation.getAnimatedFraction() == 1) {
  153. element.visible = false;
  154. }
  155. invalidateSelf();
  156. }
  157. });
  158. mParticleAnimators.add(animator);
  159. animator.start();
  160.  
  161. }
  162. mAnimator.addUpdateListener(this);
  163. mAnimator.setStartDelay(drawnDuration / 2);
  164. mAnimator.start();
  165. }
  166.  
  167. private Point bazic(int p1x, int p1y, int controllerX, int controllerY, int p2x, int p2y, float t) {
  168. int x = (int) ((1-t)*(1-t)*p1x + 2 * t * (1-t) * controllerX + t * t * p2x);
  169. int y = (int) ((1-t)*(1-t)*p1y + 2 * t * (1-t) * controllerY + t * t * p2y);
  170.  
  171. return new Point(x, y);
  172. }
  173.  
  174. @Override
  175. public void stop() {
  176. mAnimator.removeUpdateListener(this);
  177. mAnimator.end();
  178. }
  179.  
  180. @Override
  181. public boolean isRunning() {
  182. return mAnimator.isRunning();
  183. }
  184.  
  185. private int clipWidth = 0;
  186.  
  187. @Override
  188. public void onAnimationUpdate(ValueAnimator animation) {
  189. clipWidth = (int) animation.getAnimatedValue();
  190. invalidateSelf();
  191. }
  192.  
  193. private class ParticleElement {
  194. public int x;
  195. public int y;
  196. public final int color;
  197. public boolean visible = false;
  198.  
  199. private ParticleElement(int x, int y, int color) {
  200. this.x = x;
  201. this.y = y;
  202. this.color = color;
  203. }
  204. }
  205.  
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement