当前位置:  编程技术>移动开发
本页文章导读:
    ▪libgdx范例metagun代码分析(二)        libgdx实例metagun代码分析(二) 继续上一篇 http://macken.iteye.com/blog/1816708  这篇写一下metagun的时钟周期 Metagun实现了ApplicationListener接口,程序会调用定时调用render()函数进行渲染 render函数实现 pub.........
    ▪ 关于ListView的Adapter,解决ListView滚动后内容重复的有关问题        关于ListView的Adapter,解决ListView滚动后内容重复的问题 http://www.cnblogs.com/3dant/archive/2011/04/06/2007060.html这些天用到了ListView,由于要用到ImageView,且图片源不是在资源里面的,也就没法用到ID.........
    ▪ OOM解决方法       OOM解决办法 手动进行垃圾回收   调用bitmap.recycle() 或者System.gc();If you use them for fit-in screen display only, just scale them to the screen-size. You don't need any bigger.  On Feb 8, 9:48 am, Samuh <samuh.va...@gmail.com.........

[1]libgdx范例metagun代码分析(二)
    来源: 互联网  发布时间: 2014-02-18
libgdx实例metagun代码分析(二)

继续上一篇 http://macken.iteye.com/blog/1816708 

这篇写一下metagun的时钟周期

Metagun实现了ApplicationListener接口,程序会调用定时调用render()函数进行渲染

render函数实现

public void render () {
		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
		accum += Gdx.graphics.getDeltaTime();// 1/60s为   一个时钟 
		while (accum > 1.0f / 60.0f) {
			screen.tick(input);
			input.tick();
			accum -= 1.0f / 60.0f;
		}
		screen.render();
	}

 代码中1/60 s为一个时钟,达到一个时钟会调用screen和input的时钟函数tick,使得程序在低端机型和高端机型上的展现速度一样,当然这样的话低端机型的fps会低。

 

GameScreen类的tick函数实现

public void tick (Input input) {
		Stats.instance.time++;//时钟周期数 +1
		//escape按键 弹出暂停窗口
		if (!input.oldButtons[Input.ESCAPE] && input.buttons[Input.ESCAPE]) {
			setScreen(new PauseScreen(this));
			return;
		}
		if (!level.player.removed)
			level.player.tick(input);
		else if (mayRespawn) {
			if (input.buttons[Input.SHOOT] && !input.oldButtons[Input.SHOOT]) {//按X 重新开始
				respawnRoom();//重新产生当前level层对象
				mayRespawn = false;
			}
		}
		level.tick();
		Stats.instance.hats = level.player.hatCount;
	}

 

GameScreen类是游戏窗口,tick函数在render中被调用,依次更新游戏人物,游戏地图的属性

render()函数中最后调用screen.render()函数将玩家及地图渲染到窗口中,如果是低端机型,会一次性将积累的时钟周期消耗掉然后再进行渲染,极低端配置的机型可能会出现卡或人物位置瞬间变化的情况。

 


    
[2] 关于ListView的Adapter,解决ListView滚动后内容重复的有关问题
    来源: 互联网  发布时间: 2014-02-18
关于ListView的Adapter,解决ListView滚动后内容重复的问题
http://www.cnblogs.com/3dant/archive/2011/04/06/2007060.html


这些天用到了ListView,由于要用到ImageView,且图片源不是在资源里面的,也就没法用到ID了,也就不能用SimpleAdapter之类的了。只能自己改写一个Adapter,直接继承BaseAdapter。由于一开始只是在网上看了一下如何写getView这个方法,根本没有去进一步理解各个参数的含义(当然现在也没有全理解。。。),一样一来,运行没问题了,ListView里面数据也有了,结果来了个Bug,滚动的时候有些地方会重复前面出现过的图片(或者说是第一页出现去的图片)。

正常情况下的getView方法体

public View getView(int position, View convertView, ViewGroup parent){

}

  里面比较纠结的就是View convertView。

  converView就是ListView里面每条记录(Item)的样式布局。

  在ListView里面每显示一条记录就会记录就会调用一次getView。但是为了优化速度,它只会缓存当前屏幕所显示的记录的View。这个可以在getView里面加一个输出语句,看getView什么时候执行,执行过多少次。就明白了。



?
 private LayoutInflater mInflater;
 @Override
  public View getView(int position, View convertView, ViewGroup parent) {    
      // TODO Auto-generated method stub
      ViewHolder  myViews;
      if (convertView == null){
          System.out.println("为空:" + position);          
          myViews = new ViewHolder ();
          convertView = mInflater.inflate(R.layout.lst_item, null);
          myViews.mNameText = (TextView) convertView.findViewById(R.id.clst);
          myViews.mPhoto = (ImageView) convertView.findViewById(R.id.mphoto);
          convertView.setTag(myViews);
      }
      else {
          myViews = (ViewHolder ) convertView.getTag();
          System.out.println("不为空:" + position);
      }
      
      Info p = infoList.get(position);
      String dn = p.getDisplayName;
   If (!dn== null){         
    myViews.mNameText.setText(dn);
  }
  Bitmap bm = p.getPhoto();
  If(!p == null){          
    myViews.mPhoto.setImageBitmap(bm);
  }
   //myViews.mNameText.setText(dn);
      //Bitmap bm = p.getPhoto();
      //myViews.mPhoto.setImageBitmap(bm);               
      return convertView;
  }

  static class ViewHolder {
      private TextView mNameText;
      private ImageView mPhoto;
}


  回到问题上来:

  出现重复内容,基本上都是使用了ViewHolder这种方法的。

  当我们判断 convertView == null  的时候,如果为空,就会根据设计好的List的Item布局(XML),来为convertView赋值,并生成一个viewHolder来绑定converView里面的各个View控件(XML布局里面的那些控件)。再用convertView的setTag将viewHolder设置进去。

如果convertView不为空的时候,就会直接用convertView的getTag(),来获得一个ViewHolder。

  后面就是对ViewHolder里面那些控件来进行设置,比如显示文字,显示图片什么的了。

  如果再接下来的设置中,有某些条记录的某些控件没有被赋值,比如TextView因为要设置的内容为空,或者ImageView因为图片为空就没有赋值,而是直接跳过了。就类似下面这种。



?
1
2
3
4
5
6
7
8
String t = XXX.getName;
Bitmap p = XXX.getPhoto;
If (!t == null){
mViewHolder.nameText.setText(t);
}
If(!p == null){
mViewHolder.photoView.setImageBitmap(p);
}
  前面说过,ListView只会缓存第一屏里面的List Item的视图布局,之后滚动ListView后面的Item的布局就都是用前面所缓存的视图布局(也就是convertView不为null)。这样如果当后面的某一条记录里面的某些控件因上面的原因没有赋值,就会直接使用前面所缓存的视图里面的值了(里面有值的话)。

  这样的最终效果就是,滚动的时候,会出现前面已经出现过的内容。



  最简单的解决方法就是,在上面的代码中不去判断赋值内容是否为空,而是直接设定对应该控件的值,即使用事例代码中的注释部分。(去掉上面代码中的if段)

  真正的解决方法,则规避不对ViewHolder中的元素进行赋值这种情况。拿上面的代码来说:



If (!t == null){
    mViewHolder.nameText.setText(t);
}


  这个时候,在t == null 时,就没有对viewHolder进行赋值,所以在t == null时,界面上的元素就有可能是没有更新的,也就是重复上一个(这个位置视图)。所以可以加上一个else,并在里面对viewholder进行赋值。

  

If (!t == null){
    mViewHolder.nameText.setText(t);
}else{
    mViewHolder.nameText.setText("unknow");
}


  这样问题就很好的解决了。



作者:holmes Zhang
来自博客园:http://www.cnblogs.com/3dant/archive/2011/04/06/2007060.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,否则保留追究法律责任的权利。

    
[3] OOM解决方法
    来源: 互联网  发布时间: 2014-02-18
OOM解决办法

手动进行垃圾回收   调用bitmap.recycle() 或者System.gc();

If you use them for fit-in screen display only, just scale them to the 
screen-size. You don't need any bigger. 

1. Figure out the actual width and height of the image 
(inJustDecodeBounds = true) 
2. When actually loading the pic, downsample (inSampleSize > 1) so 
that the resulting image fits the screen as good as possible (for best 
result, make the loaded image a bit bigger than the screen instead of 
a bit smaller). Also, the values of inSampleSize work best across most 
phones when its value is a power of 2 (2, 4, 8, etc) 
3. Then scale the image (down) a bit further to exactly fit the 
screen. 
E.g. say your screen is 800x400. Your image is 2048x1536. Then 
downsample the image (inSampleSize = 2) --> Loaded image is 1024x768. 
Then scale the downsampled image by 52.08333% --> a bitmap of 533x400 
pixels. Cache this image. Still, be careful not to cache too many 
images. 
On Feb 8, 9:48 am, Samuh <samuh.va...@gmail.com> wrote:

 

------------------------------------------------

 

  • private Bitmap decodeFile(File f){
  •     Bitmap b = null;
  •     try {
  •         //Decode image size
  •         BitmapFactory.Options o = new BitmapFactory.Options();
  •         o.inJustDecodeBounds = true;
  •         BitmapFactory.decodeStream(new FileInputStream(f), null, o);
  •         int scale = 1;
  •         if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
  •             scale = Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
  •         }
  •         //Decode with inSampleSize
  •         BitmapFactory.Options o2 = new BitmapFactory.Options();
  •         o2.inSampleSize = scale;
  •         b = BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
  •     } catch (FileNotFoundException e) {
  •     }
  •     return b;
  • }
  • 复制代码


    Reference : 
               1.Handling big Bitmaps                        http://groups.google.com/group/a ... 1a63ad2?lnk=gst&;q=samu
               2. 'bitmap size exceeds VM budget' if Activity is restarted [includes test demo!]
                http://code.google.com/p/android/issues/detail?id=8488
               3. How to... if you want to create and destroy the Bitmaps too frequently...

    http://mobi-solutions.blogspot.c ... -to-create-and.html                       4.Handling large Bitmaps
                http://stackoverflow.com/questions/2220949/handling-large-bitmaps


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3