??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲超碰97人人做人人爱,国产精品亚洲综合一区在线观看,国产激情一区二区三区四区 http://www.aygfsteel.com/kissyan4916/Email:kissyan4916@163.com<br> zh-cnFri, 06 Jun 2025 05:22:36 GMTFri, 06 Jun 2025 05:22:36 GMT60集成FCKeditor 3.5.3http://www.aygfsteel.com/kissyan4916/archive/2011/05/18/350524.html啥都写点啥都写点Wed, 18 May 2011 13:24:00 GMThttp://www.aygfsteel.com/kissyan4916/archive/2011/05/18/350524.html      好像现在改名字了 叫CKeditor了。。?最q带学生做高校门L站,得用Struts+hibernate来做?于是项目搭建好后,集成了freemarker 以及最新版本的FCKeditor3.5.3, 可能很多初学者也在寻找这斚w的资源,所以将该DEMO上传Q欢q大家前M载, 目保证能够q行Q如若出现问题,误pL chenyanhu@vip.163.com

下蝲地址
http://download.csdn.net/source/3291055


啥都写点 2011-05-18 21:24 发表评论
]]>
android自适应屏幕方向和大?/title><link>http://www.aygfsteel.com/kissyan4916/articles/339702.html</link><dc:creator>啥都写点</dc:creator><author>啥都写点</author><pubDate>Fri, 03 Dec 2010 02:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/kissyan4916/articles/339702.html</guid><description><![CDATA[<p>一Q不同的layout</p> <p>Android手机 屏幕 大小不一Q有480x320, 640x360, 800x480.怎样才能让App自动 适应不同的屏q?呢? <br />    其实很简单,只需要在res目录下创Z同的layout文g 夹,比如layout-640x360,layout-800x480,所有的layout文g在编?之后都会写入R.java里,而系l?会根据屏q?的大自己选择合适的layoutq行使用?/p> <p>二:hdpi、mdpi、ldpi</p> <p>在之前的版本中,只有一个drawableQ?.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个Q这三个主要是ؓ了支持多分L率?/p> <p>  drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:</p> <p>  (1)drawable-hdpi里面存放高分辨率的图?如WVGA (480x800),FWVGA (480x854)</p> <p>  (2)drawable-mdpi里面存放中等分L率的囄,如HVGA (320x480)</p> <p>  (3)drawable-ldpi里面存放低分辨率的图?如QVGA (240x320)</p> <p>  pȝ会根据机器的分L率来分别到这几个文g多w面去扑֯应的囄?/p> <p>  在开?E序 时ؓ了兼容不同^?不同屏幕 Q徏议各自文件夹Ҏ需求均存放不同版本囄?/p> <p>屏幕 方向Q?/p> <p>横屏竖屏自动切换Q?/p> <p>     可以在res目录下徏立layout-port和layout-land两个目录Q里面分别放|竖屏和横屏两种布局文gQ这样在手机屏幕 方向变化的时候系l会自动调用相应的布局文gQ避免一U布局文g无法满两种屏幕 昄的问题?/p> <p>不切换:</p> <p><br /> 以下步骤是网上流传的Q不q我自己之前是通过囑Ş化界?实现q个配置Q算是殊途同归,有空我会把图片脓上来?/p> <p>q要说明一点:每个activity 都有q个属性screenOrientationQ每个activity都需要设|?Q可以设|ؓ竖屏QportraitQ,也可以设|ؓ无重力感应(nosensorQ?/p> <p>要让E序界面保持一个方向,不随手机方向转动而变化的处理办法Q?<br />   <br /> 在AndroidManifest.xml里面配置一下就可以了。加入这一行android :screenOrientation="landscape"?br /> 例如Qlandscape是横向,portrait是纵向)Q?/p> <p>代码 :</p> <p>view plaincopy to clipboardprint?<br /> <?xml version="1.0" encoding="utf-8"?>  <br /> <manifest xmlns:android="http://schemas.android.com/apk/res/android"  <br />       package="com.ray.linkit"  <br />       android:versionCode="1"  <br />       android:versionName="1.0">  <br />     <application android:icon="@drawable/icon" android:label="@string/app_name">  <br />         <activity android:name=".Main"  <br />                   android:label="@string/app_name"  <br />                   android:screenOrientation="portrait">  <br />             <intent-filter>  <br />                 <action android:name="android.intent.action.MAIN" />  <br />                 <category android:name="android.intent.category.LAUNCHER" />  <br />             </intent-filter>  <br />         </activity>  <br />                 <activity android:name=".GamePlay"  <br />                 android:screenOrientation="portrait"></activity>  <br />                 <activity android:name=".OptionView"  <br />                 android:screenOrientation="portrait"></activity>  <br />     </application>  <br />     <uses-sdk android:minSdkVersion="3" />  <br /> </manifest>  <br /> <?xml version="1.0" encoding="utf-8"?><br /> <manifest xmlns:android="http://schemas.android.com/apk/res/android"<br />       package="com.ray.linkit"<br />       android:versionCode="1"<br />       android:versionName="1.0"><br />     <application android:icon="@drawable/icon" android:label="@string/app_name"><br />         <activity android:name=".Main"<br />                   android:label="@string/app_name"<br />                   android:screenOrientation="portrait"><br />             <intent-filter><br />                 <action android:name="android.intent.action.MAIN" /><br />                 <category android:name="android.intent.category.LAUNCHER" /><br />             </intent-filter><br />         </activity><br />                 <activity android:name=".GamePlay"<br />                 android:screenOrientation="portrait"></activity><br />                 <activity android:name=".OptionView"<br />                 android:screenOrientation="portrait"></activity><br />     </application><br />     <uses-sdk android:minSdkVersion="3" /><br /> </manifest> </p> <p>另外Qandroid中每ơ屏q?的切换动会重启ActivityQ所以应该在Activity销毁前保存当前zd的状态,在Activity再次Create的时候蝲入配|,那样Q进行中的游?׃会自动重启了Q?/p> <p>有的E序适合从竖屏切换到横屏Q或者反q来Q这个时候怎么办呢Q可以在配置Activity的地方进行如下的配置android:screenOrientation="portrait"。这样就可以保证是竖屏L竖屏了,或者landscape横向?/p> <p>而有的程序是适合横竖屏切换的。如何处理呢Q首先要在配|Activity的时候进行如下的配置Qandroid:configChanges="keyboardHidden|orientation"Q另外需要重写Activity?onConfigurationChangedҎ。实现方式如下,不需要做太多的内容:</p> <p>view plaincopy to clipboardprint?<br /> @Override  <br />         public void onConfigurationChanged(Configuration newConfig) {   <br />                 super.onConfigurationChanged(newConfig);   <br />                 if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {   <br />                         // land do nothing is ok   <br />                 } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {   <br />                         // port do nothing is ok   <br />                 }   <br />         }  </p> <p> </p> <p>本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/29/6043097.aspx</p><img src ="http://www.aygfsteel.com/kissyan4916/aggbug/339702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kissyan4916/" target="_blank">啥都写点</a> 2010-12-03 10:35 <a href="http://www.aygfsteel.com/kissyan4916/articles/339702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android游戏开发之旅(二十Q?双按事g捕获http://www.aygfsteel.com/kissyan4916/articles/339701.html啥都写点啥都写点Fri, 03 Dec 2010 02:34:00 GMThttp://www.aygfsteel.com/kissyan4916/articles/339701.html对于游戏开发中我们可能l常要用到双按屏q,在Android 1.6以前q没有提供完善的手势识别c,在Android 1.5 SDK中我们可以找到android.view.GestureDetector.OnDoubleTapListenerQ但是经q测试仍然无法正常工作,不知道什么原因,如果您知道可以联pandroid123@163.com ׃n下。最l我们用的解决Ҏ如下

     最l我们测试的如下:

view plaincopy to clipboardprint?
public class TouchLayout extends RelativeLayout {  
    public Handler doubleTapHandler = null;  
    protected long lastDown = -1;  
    public final static long DOUBLE_TIME = 500;  
   
 public TouchLayout(Context context) {  
       super(context);  
       
    }  
    public TouchLayout(Context context, AttributeSet attrs) {  
       super(context, attrs);  
       
    }  
    public TouchLayout(Context context, AttributeSet attrs, int defStyle) {  
       super(context, attrs, defStyle);  
        
    }  
     
    public boolean onTouchEvent(MotionEvent event) {  
         this.handleEvent(event);  
         if (event.getAction() == MotionEvent.ACTION_DOWN) {  
            long nowDown = System.currentTimeMillis();  
            if (nowDown - lastDown < DOUBLE_TIME)  
            {  
                  if (doubleTapHandler != null)  
                     doubleTapHandler.sendEmptyMessage(-1);  
            } else {  
               lastDown = nowDown;  
            }  
         }  
         return true;  
      }  
     
     
    protected void handleEvent(MotionEvent event) {  
        switch (event.getAction()) {  
        case MotionEvent.ACTION_DOWN:  
         //Do sth q里处理卛_  
           break;  
        case MotionEvent.ACTION_UP:  
           //Do sth  
           break;  
        }  
     }  

public class TouchLayout extends RelativeLayout {
    public Handler doubleTapHandler = null;
    protected long lastDown = -1;
    public final static long DOUBLE_TIME = 500;
 
 public TouchLayout(Context context) {
       super(context);
    
    }
    public TouchLayout(Context context, AttributeSet attrs) {
       super(context, attrs);
    
    }
    public TouchLayout(Context context, AttributeSet attrs, int defStyle) {
       super(context, attrs, defStyle);
     
    }
  
    public boolean onTouchEvent(MotionEvent event) {
         this.handleEvent(event);
         if (event.getAction() == MotionEvent.ACTION_DOWN) {
            long nowDown = System.currentTimeMillis();
            if (nowDown - lastDown < DOUBLE_TIME)
            {
                  if (doubleTapHandler != null)
                     doubleTapHandler.sendEmptyMessage(-1);
            } else {
               lastDown = nowDown;
            }
         }
         return true;
      }
  
  
    protected void handleEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
         //Do sth q里处理卛_
           break;
        case MotionEvent.ACTION_UP:
           //Do sth
           break;
        }
     }
}

 

本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034698.aspx



啥都写点 2010-12-03 10:34 发表评论
]]>
Android游戏开发之旅(十八Q?SoundPoolc?http://www.aygfsteel.com/kissyan4916/articles/339699.html啥都写点啥都写点Fri, 03 Dec 2010 02:33:00 GMThttp://www.aygfsteel.com/kissyan4916/articles/339699.html对于Android的游戏音效播放,上次Android123已经告诉大家使用SoundPoolcL实现Q由于本ơ我们的游戏需要多U音效同时播放所以就选择了SoundPoolc,它和Android提供常规的MediaPlayercL哪些不同?

  1. SoundPool载入音乐文g使用了独立的U程Q不会阻塞UIȝE的操作。但是这里Android开发网提醒大家如果x文gq大没有载入完成Q我们调用playҎ时可能生严重的后果Q这里Android SDK提供了一个SoundPool.OnLoadCompleteListenercL帮助我们了解媒体文g是否载入完成Q我们重?onLoadComplete(SoundPool soundPool, int sampleId, int status) Ҏ卛_获得?

  2. 从上面的onLoadCompleteҎ可以看出该类有很多参敎ͼ比如cMidQ是的SoundPool在load时可以处理多个媒体一ơ初始化q放入内存中Q这里效率比MediaPlayer高了很多?

  3. SoundPoolcL持同时播攑֤个音效,q对于游戏来说是十分必要的,而MediaPlayercL同步执行的只能一个文件一个文件的播放?

  SoundPoolcM用示例代?

view plaincopy to clipboardprint?
SoundPool sp=new SoundPool(8, /*maxStreams*/, AudioManager.STREAM_MUSIC /*streamType*/, 100 /*srcQuality*/) ; 
SoundPool sp=new SoundPool(8, /*maxStreams*/, AudioManager.STREAM_MUSIC /*streamType*/, 100 /*srcQuality*/) ;

 有关载入x的方法,有以下几U方?

view plaincopy to clipboardprint?
int  load(Context context, int resId, int priority)  //从APK资源载入  
   int  load(FileDescriptor fd, long offset, long length, int priority)  //从FileDescriptor对象载入  
   int  load(AssetFileDescriptor afd, int priority)  //从Asset对象载入  
   int  load(String path, int priority)  //从完整文件\径名载入 
int  load(Context context, int resId, int priority)  //从APK资源载入
   int  load(FileDescriptor fd, long offset, long length, int priority)  //从FileDescriptor对象载入
   int  load(AssetFileDescriptor afd, int priority)  //从Asset对象载入
   int  load(String path, int priority)  //从完整文件\径名载入

我们看到了每个load的重载版本的最后一个参Cؓ优先U,q里用于播放多个文gӞpȝ会优先处理不q目前Android123提示大家SDK提到了目前ƈ没有实现Q所以没有实际的效果?

   对于播放Q可以?play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)   而停止则可以使用 pause(int streamID) ҎQ这里的streamID和soundID均在构造SoundPoolcȝW一个参C指明了L量,而id?开始?/p>


本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034679.aspx



啥都写点 2010-12-03 10:33 发表评论
]]>
Android游戏开发之旅(十九Q?分L率大?/title><link>http://www.aygfsteel.com/kissyan4916/articles/339700.html</link><dc:creator>啥都写点</dc:creator><author>啥都写点</author><pubDate>Fri, 03 Dec 2010 02:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/kissyan4916/articles/339700.html</guid><description><![CDATA[<p>对于Android游戏开发我们不得不像iPhone那样思考兼容Androidqx电脑Q对于苹果要考虑iPad、iPhone 3GS和iPhone 4{屏q之间的兼容性,对于几乎所有的分L率Android123ȝ了大U超q?0中粉W阿女郎的大和对应关系Q对于开发Android游戏而言可以考虑到未来的3.0以及很多qx电脑的需要?</p> <p>  常规的我们可能只考虑QVGAQHVGAQWVGAQFWVGA和DVGAQ但是抛M手机不谈Q可能^板用类?WSVGA?024x576以及WXGA?280x768{等?/p> <p>QVGA = 320 * 240;<br /> WQVGA = 320 * 480;<br /> WQVGA2 = 400 * 240;<br /> WQVGA3 = 432 * 240;<br /> HVGA = 480 * 320;<br /> VGA = 640 * 480;<br /> WVGA = 800 * 480;<br /> WVGA2 = 768 * 480;<br /> FWVGA = 854 * 480;<br /> DVGA = 960 * 640;<br /> PAL = 576 * 520;<br /> NTSC = 486 * 440;<br /> SVGA = 800 * 600;<br /> WSVGA = 1024 * 576;<br /> XGA = 1024 * 768;<br /> XGAPLUS = 1152 * 864;<br /> HD720 = 1280 * 720;<br /> WXGA = 1280 * 768;<br /> WXGA2 = 1280 * 800;<br /> WXGA3 = 1280 * 854;<br /> SXGA = 1280 * 1024;<br /> WXGA4 = 1366 * 768;<br /> SXGAMINUS = 1280 * 960;<br /> SXGAPLUS = 1400 * 1050;<br /> WXGAPLUS = 1440 * 900;<br /> HD900 = 1600 * 900;<br /> WSXGA = 1600 * 1024;<br /> WSXGAPLUS = 1680 * 1050;<br /> UXGA = 1600 * 1200;<br /> HD1080 = 1920 * 1080;<br /> QWXGA = 2048 * 1152;<br /> WUXGA = 1920 * 1200;<br /> TXGA = 1920 * 1400;<br /> QXGA = 2048 * 1536;<br /> WQHD = 2560 * 1440;<br /> WQXGA = 2560 * 1600;<br /> QSXGA = 2560 * 2048;<br /> QSXGAPLUS = 2800 * 2100;<br /> WQSXGA = 3200 * 2048;<br /> QUXGA = 3200 * 2400;<br /> QFHD = 3840 * 2160;<br /> WQUXGA = 3840 * 2400;<br /> HD4K = 4096 * 2304;<br /> HXGA = 4096 * 3072;<br /> WHXGA = 5120 * 3200;<br /> HSXGA = 5120 * 4096;<br /> WHSXGA = 6400 * 4096;<br /> HUXGA = 6400 * 4800;<br /> SHV = 7680 * 4320;<br /> WHUXGA = 7680 * 4800;</p> <p> </p> <p>本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034693.aspx</p><img src ="http://www.aygfsteel.com/kissyan4916/aggbug/339700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kissyan4916/" target="_blank">啥都写点</a> 2010-12-03 10:33 <a href="http://www.aygfsteel.com/kissyan4916/articles/339700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android游戏开发之旅(十七Q?囑փ渐变Ҏhttp://www.aygfsteel.com/kissyan4916/articles/339698.html啥都写点啥都写点Fri, 03 Dec 2010 02:32:00 GMThttp://www.aygfsteel.com/kissyan4916/articles/339698.html在Android游戏开发中我们不免要涉及到一些图形特效处理,今天主要看下Androidq_下实现渐变效果。在 android.graphics中我们可以找到有关Gradient字样的类Q比如LinearGradient U性渐变、RadialGradient径向渐变?角度渐变SweepGradient 三种Q他们的基类为android.graphics.Shader。ؓ了显C出效果android123使用一个简单的例子来说明?

  一、LinearGradientU性渐?/p>

  在androidq_中提供了两种重蝲方式来实例化该类分别为,他们的不同之处ؓ参数中第一U方法可以用颜色数组Q和位置来实现更l腻的过渡效果,比如颜色采样int[] colors数组中存?0U颜Ԍ则渐变将会逐一处理。而第二种Ҏ参数仅ؓ起初颜色color0和最l颜色color1?/p>

view plaincopy to clipboardprint?
LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)   
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)  
LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile) 

使用实例如下

view plaincopy to clipboardprint?
Paint p=new Paint();  
  LinearGradient lg=new LinearGradient(0,0,100,100,Color.RED,Color.BLUE,Shader.TileMode.MIRROR);  //参数一为渐变v初点坐标x位置Q参C为y轴位|,参数三和四分辨对应渐变终点,最后参Cؓq铺方式Q这里设|ؓ镜像 
Paint p=new Paint();
  LinearGradient lg=new LinearGradient(0,0,100,100,Color.RED,Color.BLUE,Shader.TileMode.MIRROR);  //参数一为渐变v初点坐标x位置Q参C为y轴位|,参数三和四分辨对应渐变终点,最后参Cؓq铺方式Q这里设|ؓ镜像

刚才Android开发网已经讲到Gradient是基于Shaderc,所以我们通过Paint的setShaderҎ来设|这个渐变,代码如下:

view plaincopy to clipboardprint?
p.setShader(lg);  
  canvas.drawCicle(0,0,200,p); //参数3为画圆的半径Q类型ؓfloat型?nbsp;
p.setShader(lg);
  canvas.drawCicle(0,0,200,p); //参数3为画圆的半径Q类型ؓfloat型?

二?RadialGradient镜像渐变

  有了上面的基Q我们一h了解下径向渐变。和上面参数唯一不同的是Q径向渐变第三个参数是半径,其他的和U性渐变相同?/p>

view plaincopy to clipboardprint?
RadialGradient(float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile)   
  RadialGradient(float x, float y, float radius, int color0, int color1, Shader.TileMode tile)  
RadialGradient(float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile)
  RadialGradient(float x, float y, float radius, int color0, int color1, Shader.TileMode tile) 

三?SweepGradient角度渐变

  对于一?D立体效果的渐变可以尝试用角度渐变来完成一个圆锥ŞQ相Ҏ说比上面更简单,前两个参Cؓ中心点,然后通过载入的颜色来q_的渐变渲染?/p>

view plaincopy to clipboardprint?
SweepGradient(float cx, float cy, int[] colors, float[] positions)  //对于最后一个参数SDK上的描述为May be NULL. The relative position of each corresponding color in the colors array, beginning with 0 and ending with 1.0. If the values are not monotonic, the drawing may produce unexpected results. If positions is NULL, then the colors are automatically spaced evenly.Q所以Android123使用下面的重载方法,本方法一般ؓNULL卛_?nbsp; 
SweepGradient(float cx, float cy, int color0, int color1) 


本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034673.aspx



啥都写点 2010-12-03 10:32 发表评论
]]>
Android游戏开发之旅(十六Q?异步音乐播放http://www.aygfsteel.com/kissyan4916/articles/339697.html啥都写点啥都写点Fri, 03 Dec 2010 02:29:00 GMThttp://www.aygfsteel.com/kissyan4916/articles/339697.html在Android游戏开发中我们必须考虑背景音乐播放问题Q在Androidq_中提供了MediaPlayercd以播攑֣韻I但是游戏除了播放音乐外还需要考虑画面的流畅性,以及多种x同时播放Q所以必ȝ到Android多线E机制和异步x播放。Android SDK?.0开始就提供了AsyncPlayerc,q里我们ZҎ我们自己的需要可以派生或修改出更灉|的播攄?/p>

view plaincopy to clipboardprint?
import android.content.Context;  
import android.net.Uri;  
import android.os.PowerManager;  
import android.os.SystemClock;  
import android.util.Log;  
import java.io.IOException;  
import java.lang.IllegalStateException;  
import java.util.LinkedList;  
   
public class AsyncPlayer {  
    private static final int PLAY = 1;  
    private static final int STOP = 2;  
    private static final boolean mDebug = false;  
    private static final class Command {  
        int code;  
        Context context;  
        Uri uri;  
        boolean looping;  
        int stream;  
        long requestTime;  
        public String toString() {  
            return "{ code=" + code + " looping=" + looping + " stream=" + stream  
                    + " uri=" + uri + " }";  
        }  
    }  
    private LinkedList<Command> mCmdQueue = new LinkedList();  //用一个链表保存播攑֏数队?nbsp; 
    private void startSound(Command cmd) {  
   
        try {  
            MediaPlayer player = new MediaPlayer();  
            player.setAudioStreamType(cmd.stream);  
            player.setDataSource(cmd.context, cmd.uri);  //讄媒体源,q里Android123提示大家本类的public void play (Context context, Uri uri, boolean looping, int stream) cȝ二个参数Uri为媒体位|?nbsp; 
            player.setLooping(cmd.looping);  
            player.prepare();  
            player.start();  
            if (mPlayer != null) {  
                mPlayer.release();  
            }  
            mPlayer = player;  
          }  
        catch (IOException e) {  
            Log.w(mTag, "error loading sound for " + cmd.uri, e);  
        } catch (IllegalStateException e) {  
            Log.w(mTag, "IllegalStateException (content provider died?) " + cmd.uri, e);  
        }  
    }  
    private final class Thread extends java.lang.Thread {   //通过多线E方式不d调用?nbsp; 
        Thread() {  
            super("AsyncPlayer-" + mTag);  
        }  
        public void run() {  
            while (true) {  
                Command cmd = null;  
                synchronized (mCmdQueue) {   //同步方式执行  
                        cmd = mCmdQueue.removeFirst();  
                }  
                switch (cmd.code) {  
                case PLAY:  
                                 startSound(cmd);  
                    break;  
                case STOP:  
   
                    if (mPlayer != null) {  
                                         mPlayer.stop();  
                        mPlayer.release();  
                        mPlayer = null;  
                    } else {  
                        Log.w(mTag, "STOP command without a player");  
                    }  
                    break;  
                }  
                synchronized (mCmdQueue) {  
                    if (mCmdQueue.size() == 0) {  
             
                        mThread = null;  
                        releaseWakeLock();  
                        return;  
                    }  
                }  
            }  
        }  
    }  
    private String mTag;  
    private Thread mThread;  
    private MediaPlayer mPlayer;  
    private PowerManager.WakeLock mWakeLock;  
   
    private int mState = STOP;  
   
    public AsyncPlayer(String tag) {  
        if (tag != null) {  
            mTag = tag;  
        } else {  
            mTag = "AsyncPlayer";  
        }  
    }  
   
    public void play(Context context, Uri uri, boolean looping, int stream) {  
        Command cmd = new Command();  
        cmd.requestTime = SystemClock.uptimeMillis(); //q里Z试性能Q传递了开始执行前的系ltickcount计时器?nbsp; 
        cmd.code = PLAY;  
        cmd.context = context;  
        cmd.uri = uri;  
        cmd.looping = looping;  
        cmd.stream = stream;  
        synchronized (mCmdQueue) {  
            enqueueLocked(cmd);  
            mState = PLAY;  
        }  
    }  
     
   
    public void stop() {  
        synchronized (mCmdQueue) {  
                 if (mState != STOP) {  
                Command cmd = new Command();  
                cmd.requestTime = SystemClock.uptimeMillis();  
                cmd.code = STOP;  
                enqueueLocked(cmd);  
                mState = STOP;  
            }  
        }  
    }  
    private void enqueueLocked(Command cmd) {  
        mCmdQueue.add(cmd);  
        if (mThread == null) {  
            acquireWakeLock();  
            mThread = new Thread();  
            mThread.start();  
        }  
    } 
import android.content.Context;
import android.net.Uri;
import android.os.PowerManager;
import android.os.SystemClock;
import android.util.Log;
import java.io.IOException;
import java.lang.IllegalStateException;
import java.util.LinkedList;
 
public class AsyncPlayer {
    private static final int PLAY = 1;
    private static final int STOP = 2;
    private static final boolean mDebug = false;
    private static final class Command {
        int code;
        Context context;
        Uri uri;
        boolean looping;
        int stream;
        long requestTime;
        public String toString() {
            return "{ code=" + code + " looping=" + looping + " stream=" + stream
                    + " uri=" + uri + " }";
        }
    }
    private LinkedList<Command> mCmdQueue = new LinkedList();  //用一个链表保存播攑֏数队?br />     private void startSound(Command cmd) {
 
        try {
            MediaPlayer player = new MediaPlayer();
            player.setAudioStreamType(cmd.stream);
            player.setDataSource(cmd.context, cmd.uri);  //讄媒体源,q里Android123提示大家本类的public void play (Context context, Uri uri, boolean looping, int stream) cȝ二个参数Uri为媒体位|?br />             player.setLooping(cmd.looping);
            player.prepare();
            player.start();
            if (mPlayer != null) {
                mPlayer.release();
            }
            mPlayer = player;
          }
        catch (IOException e) {
            Log.w(mTag, "error loading sound for " + cmd.uri, e);
        } catch (IllegalStateException e) {
            Log.w(mTag, "IllegalStateException (content provider died?) " + cmd.uri, e);
        }
    }
    private final class Thread extends java.lang.Thread {   //通过多线E方式不d调用?br />         Thread() {
            super("AsyncPlayer-" + mTag);
        }
        public void run() {
            while (true) {
                Command cmd = null;
                synchronized (mCmdQueue) {   //同步方式执行
                        cmd = mCmdQueue.removeFirst();
                }
                switch (cmd.code) {
                case PLAY:
                                 startSound(cmd);
                    break;
                case STOP:
 
                    if (mPlayer != null) {
                                         mPlayer.stop();
                        mPlayer.release();
                        mPlayer = null;
                    } else {
                        Log.w(mTag, "STOP command without a player");
                    }
                    break;
                }
                synchronized (mCmdQueue) {
                    if (mCmdQueue.size() == 0) {
          
                        mThread = null;
                        releaseWakeLock();
                        return;
                    }
                }
            }
        }
    }
    private String mTag;
    private Thread mThread;
    private MediaPlayer mPlayer;
    private PowerManager.WakeLock mWakeLock;
 
    private int mState = STOP;
 
    public AsyncPlayer(String tag) {
        if (tag != null) {
            mTag = tag;
        } else {
            mTag = "AsyncPlayer";
        }
    }
 
    public void play(Context context, Uri uri, boolean looping, int stream) {
        Command cmd = new Command();
        cmd.requestTime = SystemClock.uptimeMillis(); //q里Z试性能Q传递了开始执行前的系ltickcount计时器?br />         cmd.code = PLAY;
        cmd.context = context;
        cmd.uri = uri;
        cmd.looping = looping;
        cmd.stream = stream;
        synchronized (mCmdQueue) {
            enqueueLocked(cmd);
            mState = PLAY;
        }
    }
  
 
    public void stop() {
        synchronized (mCmdQueue) {
                 if (mState != STOP) {
                Command cmd = new Command();
                cmd.requestTime = SystemClock.uptimeMillis();
                cmd.code = STOP;
                enqueueLocked(cmd);
                mState = STOP;
            }
        }
    }
    private void enqueueLocked(Command cmd) {
        mCmdQueue.add(cmd);
        if (mThread == null) {
            acquireWakeLock();
            mThread = new Thread();
            mThread.start();
        }
    }

一般对于Android游戏而言下面的代码不用考虑Q一般用户都在交互操作,不会出现屏幕锁问?/p>

view plaincopy to clipboardprint?
public void setUsesWakeLock(Context context) {  //甉|理wakelock处理  
        if (mWakeLock != null || mThread != null) {  
                      throw new RuntimeException("assertion failed mWakeLock=" + mWakeLock  
                    + " mThread=" + mThread);  
        }  
        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);  
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, mTag);  
    }  
    private void acquireWakeLock() {   //加锁  
        if (mWakeLock != null) {  
            mWakeLock.acquire();  
        }  
    }  
    private void releaseWakeLock() { //解锁  
        if (mWakeLock != null) {  
            mWakeLock.release();  
        }  
    }  

 

本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034662.aspx



啥都写点 2010-12-03 10:29 发表评论
]]>
Android游戏开发之旅(十四Q?游戏开发实战一http://www.aygfsteel.com/kissyan4916/articles/339695.html啥都写点啥都写点Fri, 03 Dec 2010 02:28:00 GMThttp://www.aygfsteel.com/kissyan4916/articles/339695.html从今天开始Android123开始带领大家进入Android游戏开发实战篇Q本ơ我们首个游戏ؓ2D的基于SurfaceView的类似横版卷轴游戏。第一天我们说下需要做哪些准备:

  一、游戏地囄辑器Q在J2ME时代我们可能都是用GIF分割多或BMP上放|多个图片通过减少文g头来压羃体积Q但是在Androidq_上开发游戏我们不需要那么节省,不过资源的释放仍然很重要Q否则会出现OutOfMemoryErrorq样的悲剧发生。一般简单的2Dq面游戏地图都是使用二维数组来标记的。我们可以想象矩阵中的每个元素对应每个图片资源。详l的存储Ҏ我们在下次具体讲到?/p>

  二、控制方式,׃横版q关cL戏不适合重力感应操作Q我们这里选择屏幕下方加设一个区域,攄上、下、左、右按键Q同时右侧给出常用的d、蟩跃按钮,而游戏的暂停可以通过触控实现l箋或暂停?/p>

  三、音效处理,常规的一般在d比如出拳、发子弹的q程中有xQ或Ҏ自己中弹Q当然对于Android囑Ş开发来说就是碰撞检)时发出音效,跌、过兛_会需要一些声音素材文Ӟ一般的游戏q需要背景音乐配合烘托游戏气氛?/p>

  四、游戏逻辑Q这是主要的地方Q我们将通过实例代码让大家了解游戏开发中是如何的卯u、h物的跌、攻L效判断即撞,电脑{算法问题?/p>

  五、细节处理,比如计分Q等U,游戏计时Q关卡档案的存档Q读取以及开计,兛_q渡的过场动d理?/p>

  q里Android开发网提示大家Q目前很多J2ME的游戏可以轻杄UL到Androidq_Q主要的l节只要了解Google Androidq_的图形相关问题即可,主要是Bitmap、Drawable和ViewU程处理问题?/p>

 

本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034645.aspx



啥都写点 2010-12-03 10:28 发表评论
]]>
Android游戏开发之旅(十五Q?按键中断处理http://www.aygfsteel.com/kissyan4916/articles/339696.html啥都写点啥都写点Fri, 03 Dec 2010 02:28:00 GMThttp://www.aygfsteel.com/kissyan4916/articles/339696.html有关Androidq_上游戏开发中我们需要处理一些特别的按键事gQ对于突发的事情我们需要特别的考虑Q比如突然来电话了和游戏中按下一些特D的键,比如拍照?/p>

view plaincopy to clipboardprint?
@Override 
    public boolean dispatchKeyEvent(KeyEvent event)  
    {  
           switch (event.getKeyCode())  
           {  
             case KeyEvent.KEYCODE_VOLUME_UP:   //音量?  
             case KeyEvent.KEYCODE_VOLUME_DOWN:   //音量?  
             case KeyEvent.KEYCODE_CAMERA:  //拍照?nbsp; 
             case KeyEvent.KEYCODE_FOCUS:   //拍照键半按的对焦状?nbsp; 
          //   event.getAction() == KeyEvent.ACTION_UP   //Android123提示如果按键按下后弹h触发  
                 
            }  
                return true; //q些标记为处理过Q则不在往内部传?nbsp; 
         default:  
                break;  
        }  
        return super.dispatchKeyEvent(event);  
    } 
@Override
    public boolean dispatchKeyEvent(KeyEvent event)
    {
           switch (event.getKeyCode())
           {
             case KeyEvent.KEYCODE_VOLUME_UP:   //音量?
             case KeyEvent.KEYCODE_VOLUME_DOWN:   //音量?
             case KeyEvent.KEYCODE_CAMERA:  //拍照?br />              case KeyEvent.KEYCODE_FOCUS:   //拍照键半按的对焦状?br />           //   event.getAction() == KeyEvent.ACTION_UP   //Android123提示如果按键按下后弹h触发
              
            }
                return true; //q些标记为处理过Q则不在往内部传?br />          default:
                break;
        }
        return super.dispatchKeyEvent(event);
    }

对于游戏H然来电话我们一般采取通过PhoneStateListenercL供的public void onCallStateChanged (int state, String incomingNumber) 回调Ҏ可以获取电话的状态,比如常规I闲时CALL_STATE_IDLE、来甉|
CALL_STATE_RINGING?CALL_STATE_OFFHOOK 摘机通话中,有关处理的细节网友可以查看Android Git目中的MusicQ在Android开源项目中pȝ自带的音乐播攑֙可以很好的处理,比如在通话l束后恢复音乐播放,而我们游戏需要做的就是记住当前的游戏状态尽量数据持久化处理Q不能因为长旉的通话Q游戏的Activity被清理了Q这里我们一般通过onSaveInstanceState来保存当前窗口的一些记录,通过Intent标记来让pȝ理好我们游戏的生命周期?/p>

 

本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034653.aspx



啥都写点 2010-12-03 10:28 发表评论
]]>
Android游戏开发之旅(十二QSensor重力感应Q?Q?/title><link>http://www.aygfsteel.com/kissyan4916/articles/339694.html</link><dc:creator>啥都写点</dc:creator><author>啥都写点</author><pubDate>Fri, 03 Dec 2010 02:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/kissyan4916/articles/339694.html</guid><description><![CDATA[<p>有关Android游戏开发中的Sensor感应CZ今天我们一h讨论Q对于目前最新的Android 2.2q_ 而言仍然没有具体的感应判断逻辑Q下面我们一起定?下常用的感应动作事g。首先Android123提醒大家׃是三轴的立体I间感应所以相对于轨迹球、导航键的上下左叛_Q还提供了前后的感应Q所以我们定义最基本的六U空间方向?</p> <p>view plaincopy to clipboardprint?<br /> public static final int CWJ_UP = 0;   <br /> public static final int CWJ_DOWN = 1;   <br /> public static final int CWJ_LEFT = 2;   <br /> public static final int CWJ_RIGHT = 4;   <br /> public static final int CWJ_FORWARD = 8; //向前   <br /> public static final int CWJ_BACKWARD = 16; //向后  <br /> public static final int CWJ_UP = 0;<br /> public static final int CWJ_DOWN = 1;<br /> public static final int CWJ_LEFT = 2;<br /> public static final int CWJ_RIGHT = 4;<br /> public static final int CWJ_FORWARD = 8; //向前<br /> public static final int CWJ_BACKWARD = 16; //向后 </p> <p>下面我们做精的角度旋{修正值定义,我们用到yaw、pitch和rollQ相信学q?D开发的|友不会对这些陌生的Q我们就把他们对应ؓly、x、z 轴的角度好了Q如果你们没有学q?D相关的知识这里Android开发网推荐大家可以通过Cube例子 自定义Render来观察这三个值对应立方体的旋转角度?br /> Yaw?0,0,0)中, 以xOz的坐标^面中围绕y轴旋转,如果是负角则我们定义为CWJ_YAW_LEFT 卛_左边倾斜Q同理我们定义如? </p> <p>view plaincopy to clipboardprint?<br /> public static final int CWJ_YAW_LEFT = 0;   <br /> public static final int CWJ_YAW_RIGHT = 1;   <br /> public static final int CWJ_PITCH_UP = 2;   <br /> public static final int CWJ_PITCH_DOWN = 4;   <br /> public static final int CWJ_ROLL_LEFT = 8;   <br /> public static final int CWJ_ROLL_RIGHT = 16;  <br /> public static final int CWJ_YAW_LEFT = 0;<br /> public static final int CWJ_YAW_RIGHT = 1;<br /> public static final int CWJ_PITCH_UP = 2;<br /> public static final int CWJ_PITCH_DOWN = 4;<br /> public static final int CWJ_ROLL_LEFT = 8;<br /> public static final int CWJ_ROLL_RIGHT = 16; </p> <p>我们通过加速感应器可以获得SensorEvent的四个|今天Android123l大家一个简单示例,不考虑其他因素Q在public int accuracy 、public Sensor sensor 、public long timestamp  ?nbsp; public final float[] values 中,我们获取values的QҎl来判断方向?/p> <p>view plaincopy to clipboardprint?<br /> int nAndroid123=CWJ_UP //向上   <br /> float ax = values[0];   <br /> float ay = values[1];   <br /> float az = values[2];   <br />   <br /> float absx = Math.abs(ax);   <br /> float absy = Math.abs(ay);   <br /> float absz = Math.abs(az);   <br />      <br /> if (absx > absy && absx > absz) {   <br /> if (ax > 0) {   <br />   nAndroid123 = CWJ_RIGHT;   <br /> } else {   <br />   nAndroid123 = CWJ_LEFT;   <br /> }   <br /> } else if (absy > absx && absy > absz) {   <br />   <br /> if (ay > 0) {   <br /> nAndroid123= CWJ_FORWARD;   <br /> } else {   <br /> nAndroid123= CWJ_BACKWARD;   <br /> }   <br /> } else if (absz > absx && absz > absy) {   <br /> if (az > 0) {   <br />   nAndroid123 = CWJ_UP;   <br /> } else {   <br />   nAndroid123 = CWJ_DOWN;   <br /> }   <br /> } else {   <br /> nAndroid123 = CWJ_UNKNOWN;   <br /> }  <br />       int nAndroid123=CWJ_UP //向上<br />       float ax = values[0];<br />       float ay = values[1];<br />       float az = values[2];<br />       <br />       float absx = Math.abs(ax);<br />       float absy = Math.abs(ay);<br />       float absz = Math.abs(az);<br />         <br />       if (absx > absy && absx > absz) {<br />       if (ax > 0) {<br />         nAndroid123 = CWJ_RIGHT;<br />       } else {<br />         nAndroid123 = CWJ_LEFT;<br />       }<br />       } else if (absy > absx && absy > absz) {<br />     <br />       if (ay > 0) {<br />       nAndroid123= CWJ_FORWARD;<br />       } else {<br />       nAndroid123= CWJ_BACKWARD;<br />       }<br />       } else if (absz > absx && absz > absy) {<br />       if (az > 0) {<br />         nAndroid123 = CWJ_UP;<br />       } else {<br />         nAndroid123 = CWJ_DOWN;<br />       }<br />       } else {<br />       nAndroid123 = CWJ_UNKNOWN;<br />       } </p> <p>有关偏向角度问题Q我们将在下一ơ详l讲qͼ对于一般的2D游戏Q我们可以参考本文来实现重力控制Q所以M来说Android游戏开发比较简单易懂,Androidq_使用的Java 语言q是很适合做游戏的。在逻辑表达上更清晰?/p> <p> </p> <p>本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034640.aspx</p><img src ="http://www.aygfsteel.com/kissyan4916/aggbug/339694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kissyan4916/" target="_blank">啥都写点</a> 2010-12-03 10:27 <a href="http://www.aygfsteel.com/kissyan4916/articles/339694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">̨ʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̨ǰ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">潭</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">տ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">üɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ǩ</a>| <a href="http://" target="_blank">ǭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ͽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӯ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>