修改FallView文件,主要参考RenderScriptWallpaper和RenderScriptWallpaper中对RenderscriptGL初始化和调用的时机,在覆写的RSSurfaceView指定方法中初始化和调用RenderScriptGL。

FallView.java文件如下:

/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.harlan.waterscreen;import android.content.Context;import android.renderscript.RSSurfaceView;import android.renderscript.RenderScript;import android.renderscript.RenderScriptGL;import android.view.MotionEvent;import android.view.SurfaceHolder;class FallView extends RSSurfaceView {    private FallRS mRender;    /*******add by Harlan***********************/    private RenderScriptGL mRs;    /*******************************************/    public FallView(Context context) {        super(context);        setFocusable(true);        setFocusableInTouchMode(true);    }    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {        super.surfaceChanged(holder, format, w, h);//        RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();//        RenderScriptGL RS = createRenderScriptGL(sc);//        mRender = new FallRS(w, h);//        mRender.init(RS, getResources(), false);//        mRender.start();        /*******add by Harlan***********************/        if (mRs != null) {            mRs.setSurface(holder, w, h);        }        if (mRender == null) {            mRender = new FallRS(w, h);            mRender.init(mRs, getResources(), false);            mRender.start();        } else {            mRender.resize(w, h);        }        /*****************************************/    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:            case MotionEvent.ACTION_MOVE:                mRender.addDrop(event.getX(), event.getY());                try {                    Thread.sleep(16);                } catch (InterruptedException e) {                    // Ignore                }                break;        }        return true;    }        /*******add by Harlan***********************/   @Overridepublic void surfaceCreated(SurfaceHolder holder){    super.surfaceCreated(holder);    //初始化RenderScriptRS    RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();if (mRs == null) {mRs = createRenderScriptGL(sc);}    mRs.setPriority(RenderScript.Priority.LOW);}        @Override    protected void onDetachedFromWindow()    {        super.onDetachedFromWindow();        destroyRenderer();    }        private void destroyRenderer() {        if (mRender != null) {            mRender.stop();            mRender = null;        }        if (mRs != null) {            mRs.setSurface(null, 0, 0);            mRs.destroy();            mRs = null;        }    }    }

在Fall activity中将FallView设为内容背景。放在我的手机上运行下,发现已经可以实现大致功能,但连续触屏时,水滴团簇在一块儿,效果不是很好,而且没有水滴音效,不是很自然。

如图:

处理下,先加上音效.这里我使用SoundPool播放音效。SoundPool使用音效池的概念来管理多个短促的音效,在程序中按照音效的ID进行播放。

为了方便管理SoundPool所加载的每个声音的ID,我使用了一个HashMap<Integer,Integer>对象来管理声音。(音频文件提取自三星9300)

定义需要用到的常量变量:

public static final int PLAY_DROP_MUSIC = 0x1;public static final int PLAY_WATER_MUSIC = 0x2;private boolean isPlay;private static int sConut;private SoundPool mSound;private HashMap<Integer, Integer> soundMap;

在surfaceCreated(SurfaceHolder holder)方法中添加:

    mSound = new SoundPool(2, AudioManager.STREAM_RING, 5);    soundMap = new HashMap<Integer, Integer>();    soundMap.put(1, mSound.load(getContext(), R.raw.drop, 5));    soundMap.put(2, mSound.load(getContext(), R.raw.water, 5)); 

在TouchEvent事件中加上音效的播放,并对水波纹addDrop方法调用的频率改进一下,使其自然些。

 @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:            mSound.play(soundMap.get(1), 5, 5, 0, 0, 1);            isPlay = true;            sConut = 0;            mRender.addDrop(event.getX(), event.getY());            break;            case MotionEvent.ACTION_MOVE:            sConut ++;                if (isPlay){                mSound.play(soundMap.get(2), 5, 5, 0, 0, 1);                isPlay = false;                }                if (sConut <10){                mRender.addDrop(event.getX(), event.getY());                }                MotionEvent.obtain(event).setAction(MotionEvent.ACTION_UP);                try {                    Thread.sleep(150);                } catch (InterruptedException e) {                    // Ignore                }                break;        }        return true;    }

好了,这时候水波纹的效果就自然很多了。

好了,大致完工了,最后将pond.png图片置换为三星蒲公英图片。另外,在Manifest文件里面将应用主题设置为全屏显示。

 android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"

值得注意的是,源码枫叶壁纸中,河床是图片的倒影,因此蒲公英也是倒着的,修改下参数,将FallRS.java中String t中的

" varTex0 = vec2((pos.x + 1.0), (pos.y + 1.6666));\n" +

以及

"  varTex0.xy *= vec2(0.25, 0.33);\n" +

修改为

"  varTex0 = vec2((pos.x +1.2), (-pos.y+1.15));\n" +
"  varTex0.xy *= vec2(0.4, 0.45);\n" +


OK,大功告成,最终效果图:

最后,贴上附件(三星S3水波纹触屏效果源码):

http://download.csdn.net/detail/singleton1900/4975456

更多相关文章

  1. 调用C++底层 Thread & Mutex 的注意事项
  2. Android中onInterceptTouchEvent与onTouchEvent
  3. Android调用测试
  4. Android(安卓)GraphicBuffer
  5. Android(安卓)电话的反射调用机制实现静默接听电话
  6. Android(安卓)增量更新实例(Smart App Updates)
  7. Android启动过程
  8. Android(安卓)JsBridge 源码解析
  9. Android(安卓)中 ListView Adapter getView 被多次调用问题 解决

随机推荐

  1. Android RelativeLayout
  2. Android中使用Context?这几点要注意
  3. Android中RelativeLayout各个属性,例如:and
  4. Android Studio 1.0 苹果电脑安装配置
  5. Android工具箱之组织你的代码文件
  6. Android 应用程序基础知识(1)
  7. AndroidDevTools收集整理Android开发所需
  8. Android布局之xml设置
  9. Android中application的theme不生效的bug
  10. android android:gravity 不起作用