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

如图:

1356741968_6316.png

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

为了方便管理SoundPool所加载的每个声音的ID,我使用了一个HashMap对象来管理声音。(音频文件提取自三星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 soundMap;

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

mSound = new SoundPool(2, AudioManager.STREAM_RING, 5);

soundMap = new HashMap();

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;

}

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

1356791180_7061.png

好了,大致完工了,最后将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,大功告成,最终效果图:

1356792539_5780.png

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值