Android 碎屏效果 (Crack Screen,击碎屏幕)

本文介绍一个好玩的App   如图:



实现思路:在一个透明的Activity上用一个自定义View,然后在View上画.9的碎玻璃图片,加上音效。然后过一段时间消失。

主要用一个postInvalidate();方法,用一个集合去装手指触摸过的地方,在touch事件中调用postInvalidate();方法进行视图重新绘制。

需要注意的是,这里的播放音效和上篇博客 Android 闪电效果 (Electric Screen,电动屏幕) 中的播放音效一样,暂停音效的时候要传开始播放时得到的int返回值,和停止音效不一样。

可以通过限制集合长度来限制绘制的屏幕个数。

单独开启一个线程,过一段时间开始清除效果, 即直接操作集合,操作完了调用postInvalidate(); 重新绘图就可以了。

示例代码:

[java]  view plain copy
  1. public class CustomView extends View {  
  2.     private Paint mPaint;  
  3.     private SoundPool mSoundPool;  
  4.     private Map<Integer, Integer> mSoundMap = new HashMap<Integer, Integer>();  
  5.     private int mIndex;  
  6.     private Bitmap mBitmap;  
  7.     private ArrayList<Float> mXPointList;  
  8.     private ArrayList<Float> mYPointList;  
  9.     private int mCount = 0;// 点击次数  
  10.     private int mLength = 30;// 绘制总数  
  11.   
  12.     public CustomView(Context context, AttributeSet attrs) {  
  13.         super(context);  
  14.         mPaint = new Paint();  
  15.         mPaint.setAntiAlias(true);  
  16.         mPaint.setColor(Color.BLUE);  
  17.         // mPaint.setAlpha(127);  
  18.         mPaint.setStrokeWidth(2.0f);  
  19.         this.setKeepScreenOn(true);  
  20.         this.setFocusable(true);  
  21.         this.setLongClickable(true);  
  22.         this.mSoundPool = new SoundPool(5, AudioManager.STREAM_SYSTEM, 5);  
  23.         this.mSoundMap.put(1, mSoundPool.load(context, R.raw.cfokwowbfv, 1));  
  24.         this.mBitmap = BitmapFactory.decodeResource(getResources(),  
  25.                 R.drawable.screen);  
  26.         mXPointList = new ArrayList<Float>();  
  27.         mYPointList = new ArrayList<Float>();  
  28.         new Thread(new Runnable() {  
  29.   
  30.             @Override  
  31.             public void run() {  
  32.                 // TODO Auto-generated method stub  
  33.                 while (true) {  
  34.                     try {  
  35.                         Thread.sleep(4000);  
  36.                     } catch (InterruptedException e) {  
  37.                         // TODO Auto-generated catch block  
  38.                         e.printStackTrace();  
  39.                     }  
  40.                     // mG++;  
  41.                     handler.sendEmptyMessage(0);  
  42.                 }  
  43.   
  44.             }  
  45.         }).start();  
  46.   
  47.     }  
  48.   
  49.     @Override  
  50.     public boolean onTouchEvent(MotionEvent arg1) {  
  51.         // TODO Auto-generated method stub  
  52.         switch (arg1.getAction()) {  
  53.         case MotionEvent.ACTION_DOWN:  
  54.             // drawBitmap(arg1.getX(), arg1.getY());  
  55.             playSound();  
  56.             mXPointList.add(arg1.getX());  
  57.             mYPointList.add(arg1.getY());  
  58.             postInvalidate();  
  59.             mCount++;  
  60.             if (mCount > mLength) {  
  61.                 mXPointList.remove(0);  
  62.                 mYPointList.remove(0);  
  63.                 mLength++;  
  64.             }  
  65.             break;  
  66.         case MotionEvent.ACTION_UP:  
  67.             break;  
  68.         case MotionEvent.ACTION_MOVE:  
  69.             break;  
  70.         default:  
  71.             break;  
  72.         }  
  73.         return super.onTouchEvent(arg1);  
  74.     }  
  75.   
  76.     @Override  
  77.     protected void onDraw(Canvas canvas) {  
  78.         super.onDraw(canvas);  
  79.         for (int i = 0; i < mXPointList.size(); ++i) {  
  80.             canvas.drawBitmap(mBitmap, mXPointList.get(i) - mBitmap.getWidth()  
  81.                     / 2, mYPointList.get(i) - mBitmap.getHeight() / 2null);  
  82.         }  
  83.     }  
  84.   
  85.     // 播放  
  86.     public void playSound() {  
  87.         mIndex = mSoundPool.play(mSoundMap.get(1), 11001);  
  88.     }  
  89.   
  90.     // 停止播放  
  91.     public void stopSound() {  
  92.         // Toast.makeText(getContext(), "zzzzz", 0).show();  
  93.         mSoundPool.stop(mIndex);  
  94.     }  
  95.   
  96.     @Override  
  97.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  98.         // TODO Auto-generated method stub  
  99.         Toast.makeText(getContext(), "keydown", Toast.LENGTH_SHORT).show();  
  100.         return super.onKeyDown(keyCode, event);  
  101.     }  
  102.   
  103.     // 更新界面  
  104.     Handler handler = new Handler() {  
  105.         public void handleMessage(Message msg) {  
  106.             if (msg.what == 0) {  
  107.                 if (mCount != 0 && mXPointList.size() != 0) {  
  108.                     for (int i = 0; i < new Random()  
  109.                             .nextInt(mXPointList.size() + 1); i++) {  
  110.                         mXPointList.remove(0);  
  111.                         mYPointList.remove(0);  
  112.                         mLength++;  
  113.                     }  
  114.                 }  
  115.                 postInvalidate();  
  116.   
  117.             }  
  118.         }  
  119.     };  
  120. }  



Github:  https://github.com/OneHead/crack_screen2D

Weibo: http://weibo.com/2382477985

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值