今天在做listview 设置宽高的时候,因为是自定义的item样式。
遇到一些问题。
具体就是item项为一个线性布局。直接是linearlayout ,然后具体的imageview,textview了。
当适配不同屏的机型时,发现这个item项高度比例不对,我用的是dip,
然后怎么调linearlayout的height都无济于事。
后来抱着试试看的想法,在外围再包一层linearlayout,设置内部嵌套的linearlayout的宽高,即可。
不知道是何缘故...反正就好使了..
移动这一块目前是iPhone遥遥领先,程序员是爱买Android,一般老百姓还是偏向iPhone。现在做手机程序的统统是iPhone优先策略——做一个程序,先写iPhone版,第二才考虑Android。在iPhone的带动下,Mac OS 在美国市场占有率都上升到9%了,相当可怕,有人认为苹果将成为九十年代带的微软。
从根子上来讲,谷歌是一家广告公司,苹果是一家设计公司,如果只是他们俩在竞争,鹿死谁手还真不好说;可Android是一个开源程序,开源是IT界的倾销手段,因为它免费的正大光明。真正在背后支持Android的力量,是三星、摩托罗拉这些被苹果抢了市场分额的手机公司,没有Android,这些手机公司就活不了了(当然,现在又有了WP7……)。此外,因为Android是开源的,它会被大量应用到其他产品上,就是所谓的物联网。Android以后会成为高端的设备上的嵌入式开发平台,比如汽车App或者其他什么的。应用广就意味着更大的程序员群体,更大的群体意味着技术发展的更快……形成一种良性循环。苹果的系统只能在iPhone上跑,应用面就窄的多。所以笔者认为苹果不会成为就九十年代的微软,笔者认为苹果将成为……还是九十年代的苹果。孤芳自赏是没有好下场的。
不过,笔者觉得这俩平台都不是未来的Windows,Windows是一个不能被重复的传说。你看,就算Android能打赢iOS,它能垄断市场吗?不能。苹果也不是吃素的,Android和iOS在未来一段时间内应该都是齐头并进,更何况现在又出了Windows Phone,还有黑莓和诺基亚……不能因为过气了你就当人家不存在呀,俗话说瘦死的骆驼比马大不是?也就是说,移动平台注定是百花齐放的局面,不可能出现当年Windows一统江山的情景。那么,如果没有统一的操作系统,开发程序就是一件麻烦的事情,同一个软件要写好几个版本,这事儿效率太低。当多平台并存已成定局的时候,群众最需要的就是跨平台的技术。
目前开发移动程序框架选择很多,从Web App,到PhoneGap,Titanium,MonoTouch,再到Native App,总有一款适合你。规律是,兼容性越强的技术,成本越低,性能越差;兼容性越差的技术,成本越高,性能越好。在众多框架里,笔者最看好PhoneGap。有以下两个原因:
1、兼容性。完全做到了written once, run everywhere。
2、标准化。PhoneGap用W3C标准,特别标准,Web App直接一字不改就能运行。尤其是和JQ Mobile结合在一起使用,实在是威力无穷啊!
3、用JavaScript+HTML5。你说这和iOS以及Anroid的代码加XML有区别吗?我看都差不多。
当然目前PhoneGap缺陷还是蛮多的,比如运行速度慢,UI反应延时——这是个致命伤。不过嘛,这种问题是会随着技术的进步而消失的。它的优势是无以伦比的:开发成本低——笔者个人估计,至多是Native App的五分之一吧。伟大导师马\克\思教导我们说,资本有了300%的利润,就敢践踏一切人间法律。跨平台的流行是不可避免的。当然,Native App永远会有一席之地,比如高端游戏。
有的技术虽然高明,如果找不到切入点也流行不起来。就算再有潜力的种子,没有生存的土壤也长不成大树。最典型的例子就是标准Qwerty键盘,再不好使大家也一直在用。PhoneGap是不会成为空中楼阁的,它现在已经遍地开花了,网上很多招工都指明要PhoneGap做。表面上看来,做PhoneGap的是温哥华的一家小公司,但是……和Android一样,PhoneGap也是开源项目,这里头猫腻可就多了去啦。现在,IBM给PhoneGap贡献的代码,比PhoneGap母公司还多!为啥大家这么支持PhoneGap呢?笔者觉得JQ Mobile主页上的一张合作伙伴的图特别说明问题,请看:
这张图片的名字就叫……找找少了谁?咦,怎么没有谷歌呀。谷歌不是一直支持JQuery,最Web Centric吗,怎么不支持JQ Mobile了?是了,谷歌有Android,不需要Web App也可以分到一大块市场,甚至Web App会降低开发门槛,反而会削弱Android的竞争力。利益当前,谷歌把不作恶这事儿也忘了。但是,就像新闻联播里经常说的,人民,只有人民才是这世界的主人。历史潮流是挡不住的,谁都不行,谷歌也不行。看看上面图片里这些公司,黑莓、诺基亚、Palm……他们都是曾经的强者,现在却是被Android和iOS边缘化的弱者。如果你想做移动开发,你可能选择Android,也可能选择iOS,但你会选择黑莓吗?诺基亚?——没有应用程序是操作系统最大的痛啊。因此,他们才是最需要跨平台技术的。每多一个跨平台技术的程序员,就等于多了一个黑莓程序员、诺基亚程序员……跨平台也是符合生产力发展规律的,是进步的,是革命的,是人民的呼声!弱者单独看起来很弱,团结起来便力量惊人,可以战胜一切,可以推翻霸权,伟大领袖都是这么做的。
来源:读者投稿,原文链接。
实例11播放按键声音,在java me中有playTone的方法,可以指定一些特定的频率播放,在android中,我没找到相应的方法,所以就用了另一种方法,但是播放出来的生硬不是音乐的音符,只是其他的一些声音,下面给出源代码。因为简单,也没有涉及到界面,所以就不给出效果图,也没有MainView,就单单一个acitivity.
package com.wjh.test_tone; import android.app.Activity; import android.media.AudioManager; import android.media.ToneGenerator; import android.os.Bundle; import android.view.KeyEvent; public class TestTone extends Activity { /** Called when the activity is first created. */ ToneGenerator tonePlayer = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tonePlayer = new ToneGenerator(AudioManager.STREAM_MUSIC, 70); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub switch(keyCode) { case KeyEvent.KEYCODE_0: tonePlayer.startTone(ToneGenerator.TONE_DTMF_0,100); break; case KeyEvent.KEYCODE_1: tonePlayer.startTone(ToneGenerator.TONE_DTMF_1,100); break; case KeyEvent.KEYCODE_2: tonePlayer.startTone(ToneGenerator.TONE_DTMF_2,100); break; case KeyEvent.KEYCODE_3: tonePlayer.startTone(ToneGenerator.TONE_DTMF_3,100); break; case KeyEvent.KEYCODE_4: tonePlayer.startTone(ToneGenerator.TONE_DTMF_4,100); break; case KeyEvent.KEYCODE_5: tonePlayer.startTone(ToneGenerator.TONE_DTMF_5,100); break; case KeyEvent.KEYCODE_6: tonePlayer.startTone(ToneGenerator.TONE_DTMF_6,100); break; case KeyEvent.KEYCODE_7: tonePlayer.startTone(ToneGenerator.TONE_DTMF_7,100); break; case KeyEvent.KEYCODE_8: tonePlayer.startTone(ToneGenerator.TONE_DTMF_8,100); break; case KeyEvent.KEYCODE_9: tonePlayer.startTone(ToneGenerator.TONE_DTMF_9,100); break; } return super.onKeyDown(keyCode, event); } }
在想playtone的时候,我在csdn发问了,fontlose回答了一种方法,我觉得还不错,有发出那7个声音,下面给出他提供的方法源码:
private final int duration = 1; // seconds private final int sampleRate = 8000; private final int numSamples = duration * sampleRate; private final double sample[] = new double[numSamples]; private final double freqOfTone[] ={262, 294,330,349,392,440,494,524}; // do,rui,mi,fa,so,la,xi,dou的频率 private final byte generatedSnd[] = new byte[2 * numSamples]; private int freqCnt=0; class PlayThread extends Thread { private int playfreq;//播放频率 public PlayThread(int cnt) { playfreq=cnt%8; } @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < numSamples; ++i) { sample[i] = Math.sin(2 * Math.PI * i / (sampleRate/freqOfTone[playfreq])); } int idx = 0; for (final double dVal : sample) { // scale to maximum amplitude final short val = (short) ((dVal * 32767)); // in 16 bit wav PCM, first byte is the low order byte generatedSnd[idx++] = (byte) (val & 0x00ff); generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8); } final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, numSamples, AudioTrack.MODE_STATIC); audioTrack.write(generatedSnd, 0, generatedSnd.length); audioTrack.play(); super.run(); } }
new PlayThread(0).start(); //0播发duo 1播放rui 2播放mi ......
apk文件(将后缀改为 apk):Demon_11.zip
源代码文件:Demon_11.rar