实现三星S3蒲公英水波纹效果(三)——Activity水波纹实现篇

修改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***********************/
   @Override
public 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设为内容背景。放在我的手机上运行下,发现已经可以实现大致功能,但连续触屏时,水滴团簇在一块儿,效果不是很好,而且没有水滴音效,不是很自然。

如图:

 实现三星S3蒲公英水波纹效果(三)——Activity水波纹实现篇_第1张图片

处理下,先加上音效.这里我使用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;
    }

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

实现三星S3蒲公英水波纹效果(三)——Activity水波纹实现篇_第2张图片

 

好了,大致完工了,最后将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蒲公英水波纹效果(三)——Activity水波纹实现篇_第3张图片

 

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

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

你可能感兴趣的:(android,android,android,三星,水波纹特效)