当前位置:  编程技术>移动开发
本页文章导读:
    ▪java中中文乱码缘故        java中中文乱码原因 Java中文乱码原因Java在中文环境中乱码无处不在,而且出现的时间和位置也包涵广泛,具体的解决方法也是千奇百怪。但是如果能理清其中的脉络,理解字符处 理的过程,对.........
    ▪ Timer种和其他算法        Timer类和其他算法 【Timer计时器的使用】var timer:Timer = new Timer(delay:Number, repeatCount:int = 0);timer.addEventListener(TimerEvent.TIMER, onTimer);timer.start();private function onTimer(event:TimerEvent):void {    //code}  .........
    ▪ Gallery兑现无限循环的方法       Gallery实现无限循环的方法 Android的控件Gallery提供一个画廊效果,通过左右滑动,可以水平滚动浏览Gallery中的图片。网上的教程或者Gallery都介绍这个控件用来显示图片(Image),但其实,它可.........

[1]java中中文乱码缘故
    来源: 互联网  发布时间: 2014-02-18
java中中文乱码原因
Java中文乱码原因

Java在中文环境中乱码无处不在,而且出现的时间和位置也包涵广泛,具体的解决方法也是千奇百怪。
但是如果能理清其中的脉络,理解字符处 理的过程,对于解决问题很有指导意义,不至于解决了问题也不知道为什么。
其实,原因不外乎出在String输入时和输出时。

首先,Java中的任何String都是以UNICODE格式存在的。
很多人因为在GBK环境中使用String,会误以为String是GBK格式,实际上Java的String类中并没有存储CharSet信息的字段, 所有String中的字符只会以UNICODE的2字节形式存在。
String在构造时会逐一把字符按指定编码(默认值为系统编码GBK),转换为UNICODE字符,存入一个Char(无符号16位)数组中。

如:
new String(bytes,"gbk");

并不是说,生成一个GBK编码的字符串,而是按GBK逐一辨认字节数组bytes中的字符转化为UNICODE。
假设,bytes本是按GB编码的,构造方法在发现一个最高位为0的byte就作为ascii字符处理,最高位为1就和后面的一个byte合成中文字符, 再转换编码。
可以看出,在这个过程中,编码选择错误就会导致程序按错误方法辨认bytes,乱码就出现了。
在这里产生的乱码,很多时候还可以通过.getByte()方法修复,还没有后面的严重。

如:
"中".getBytes("iso-8859-1");

因为iso-8859-1中没有中文,所以"中"的值被替换成63,显示'?',无法判断以前是什么值。

所以如下String将被破坏掉:
new String("中文".getBytes("iso-8859-1"),"iso-8859-1");

如果目标编码方式支持中文,就不会损坏String:
new String("中文".getBytes("utf-8"),"utf-8");

Java在显示字符时,还需要进行一次转换,把UNICODE字符转换成用于显示的字符编码形式。
很多时候,这个过程是自动的,会按系统的默认编码(一般是GBK)转换String。
如果和页面编码不一样,就会出现乱码,虽然在Java的程序中只有一种编码,输出却可以有不同的编码。

有时候,我们需要用 iso-8859-1格式分解String的中文,以便在不支持中文的系统中存储:
new String("中文".getBytes("GBK"),"iso-8859-1");
先通过GBK等支持中文的编码方式分解为byte数组,再做为iso-8859-1字符组成字符串,就避免了被替换为Char(63)。

=========================================================================

示例程序

public static void main(String[] args)

String str = "中国"; 
printBytes("中国的UNICODE编码:", str.getBytes(Charset.forName("unicode"))); 
printBytes("中国的GBK编码:", str.getBytes(Charset.forName("GBK"))); 
printBytes("中国的UTF-8编码:", str.getBytes(Charset.forName("UTF-8"))); 


public static void printBytes(String title, byte[] data)

System.out.println(title); 
for (byte b : data)

System.out.print("0x" + toHexString(b) + " "); 

System.out.println();    


public static String toHexString(byte value)

String tmp = Integer.toHexString(value & 0xFF); 
if (tmp.length() == 1)

tmp = "0" + tmp; 


return tmp.toUpperCase(); 


上例的输出结果为:

中国的UNICODE编码:
0xFE 0xFF 0x4E 0x2D 0x56 0xFD
中国的GBK编码:
0xD6 0xD0 0xB9 0xFA
中国的UTF-8编码:
0xE4 0xB8 0xAD 0xE5 0x9B 0xBD


    
[2] Timer种和其他算法
    来源: 互联网  发布时间: 2014-02-18
Timer类和其他算法
【Timer计时器的使用】

var timer:Timer = new Timer(delay:Number, repeatCount:int = 0);

timer.addEventListener(TimerEvent.TIMER, onTimer);

timer.start();

private function onTimer(event:TimerEvent):void {

    //code

}

 
【以指定方向和速度移动元件】

speed: 目标速度

radians: speed与x轴的夹角,弧度

vx = Math.cos(radians) * speed;

vy = Math.sin(radians) * speed;

 
【缓动动画算法】

targetX,targetY: 目标坐标;

easingSpeed: 每次移动分数,范围0到1;

var vx:Number = (targetX - sprite.x) * easingSpeed;

var vy:Number = (targetY - sprite.y) * easingSpeed;

sprite.x += vx;

sprite.y += vy;

注意: 在非常逼近目标点时,往往找出通往目标点的距离,如果其值少于特定值,就应该停止该缓动.

 
【模拟弹簧往复运动算法】

五个变量: targetX(目标点的x坐标),sprite.X(物体的x坐标),vx(水平速度),ax(水平加速度),k(弹簧强度)

已知: targetX(目标点的x坐标),k(弹簧强度)

var ax:Number = (targetX - sprite.x) * k;

vx += ax;

sprite.x += vx;

注意: 这里只是水平方向的情形,也可以推广到垂直方向以及水平垂直一起来的情形

 
【模拟单摆运动】

四个变量: sprite.x(物体的x坐标),centerX(中心位置的x坐标),angle(弧度),radius(摆动的振幅,也就是摆动的范围)

sprite.x = centerX + Math.sin(angle) * radius;

angle += 0.05;

 
【模拟阻尼运动】

六个变量: targetX(目标点的x坐标),sprite.X(物体的x坐标),vx(水平速度),ax(水平加速度),k(弹簧强度),damp(阻尼系数)

已知: targetX(目标点的x坐标),k(弹簧强度)

var ax:Number = (targetX - sprite.x) * k;

vx += ax;

sprite.x += vx;

vx *= damp; //无阻力情况下的弹簧往复运动只缺少此句

注意: 这里只是水平方向的情形,也可以推广到垂直方向以及水平垂直一起来的情形.

这种原理可以推广到其它属性,如scaleX:

scaleVel += (targetScale - sprite.scaleX) * k;

sprite.scaleX += scaleVel;

scaleVel *= damp;

 
【计算两点间的角度】

Math.atan2(y:Number, x:Number):Number

y: 两点间的垂直距离

x: 两点间的水平距离

返回一个以弧度为单位的角度,返回值介于正PI和负PI之间.

 
【让物体指着鼠标(跟随眼睛)】

var dx:Number = mouseX - sprite.x;

var dy:Number = mouseY - sprite.y;

var radians:Number = Math.atan2(dy, dx);

sprite.rotation = radians * 180 / Math.PI;

 
【联结字符串时需要注意的地方】

var result:String = 2 + 6 + "a";

trace(result); //输出: 8a

var result:String = "a" + 2 + 6;

trace(result); //输出: a26

var result:String = "a" + (2 + 6);

trace(result); //输出: a8

 
【查找匹配的字符串】

使用String.indexOf(val:String, startIndex:Number = 0):int

返回指定子字符串的第一个匹配项的索引,没有匹配就返回-1

查找所有匹配的字符串:

var index:int = -1;

while((index = myString.indexOf("val", index + 1)) != -1) {

    trace("结果:" + index);

}

使用String.lastIndexOf(val:String, startIndex:Number = 0x7FFFFFFF):int

返回指定子字符串的最后一个匹配项的位置,没有匹配就返回-1

var index:int = myString.length;

while((index = myString.lastIndexOf("val", index - 1)) != -1) {

    trace("结果:" + index);

}

注意: indexOf()和lastIndexOf()方法都是区分大小写的.想把大小写都查找出来的话,可以结合String.toLowerCase()和String.toUpperCase()方法先把字符串一起转为小写或大写再进行查找.

 
【提取子字符串】

String.substr(startIndex:Number = 0, len:Number = 0x7fffffff):String

String.substring(startIndex:Number = 0, endIndex:Number = 0x7fffffff):String

String.slice(startIndex:Number = 0, endIndex:Number = 0x7fffffff):String

substr()第一个参数可以是负值,表示索引值是从字符串尾端算过来,-1是最后一个字符;

substring()和slice()差别在于substring()只接受正索引值,而把负值作为0处理.另外,如果endIndex小于startIndex,substring()方法在执行前,会自动将其调换过来,总是使用两个参数中较小的值作为起始索引.

slice()方法可接受startIndex和endIndex为负值,而把负值表示为从字符串的尾端算回来,如果endIndex小于startIndex,slice()方法会返回空字符串.

 
【以指定模式拆分字符串】

String.split(delimiter:*, limit:Number = 0x7fffffff):Array

 
【替换指定的字符串】

使用String.replace(pattern:*, repl:Object):String

可以这样来替换所有指定的字符串: myString.split("a").join("b");

 
【按单词或单个字母逆转字符串】

1. 把字符串切割使用String.split()方法成一个数组:对单词而言,以空格作为分界符,对字母而言,以空字符("")作为分界符;

2. 使用Array.reverse()方法对数组进行逆转;

3. 使用Array.join()方法重新组合为字符串:对单词而言,以空格(" ")作为联结符,对字母而言,以空字符("")作为联结符;


    
[3] Gallery兑现无限循环的方法
    来源: 互联网  发布时间: 2014-02-18
Gallery实现无限循环的方法

Android的控件Gallery提供一个画廊效果,通过左右滑动,可以水平滚动浏览Gallery中的图片。网上的教程或者Gallery都介绍这个控件用来显示图片(Image),但其实,它可以显示任意的View,当然也包括Layout了。


Gallery只能从第一项开始,滚动浏览到最后一项。浏览最后一项后,就不能再滚动,只能回退浏览。但是,我们想达到这样的效果:

在Gallery中显示了4张图片,分别是“西施”、“杨贵妃”、“王昭君”、“貂蝉”。



 
        浏览效果是,每屏只显示一个图片,向左滑动时显示前一个图片,向左滑动时显示后一个图片。当向右浏览到第4张图片“貂蝉”时,再向右滑动时,回到第一张图片,进行循环浏览。
在实现这样的效果,首先要对Gallery的Adapter进行修改。
无论你使用哪个Adapter,都需要修改两处的:
1、public int getCount() 方法要返回一个很大的数。它表示Adapter提供的数据在数量。比如上面四个图片,它返回的就是4。这个数字的意义就是:当你向右滑动四次之后,它就不再向右滑动了,哪怕你后面还有数据。要实现无限循环,必须把它修改成一个很大的值。什么值最大呢?Integer.MAX_VALUE 肯定够大,20亿啊。
2、public View getView(int position, View convertView, ViewGroup parent) 中的position值,是实现循环的关键。它表示当前要显示的哪一个VIEW。举例说,上面四张图,刚显示时,position = 0,当向右滑动,显示下一个图片是,position = 1。再向右滑动,显示第三张时,position = 2。如果向左滑动,回退浏览第二张图片时,position = 1。
如此,当我们浏览到第四张图片时,position = 3 ,按我们想实现的效果,再向左滑动时,要显示的图上应该是第一张,即 position = 0 才行。所以,关键是要实现 position 从 0 到 3 的循环。这个好办,通过取余就可以实现了。
我使用SimpleAdapter向Gallery提供数据,查看Android的SimpleAdapter源码:

/**
        
	 * @see android.widget.Adapter#getCount()
	 */
	public int getCount() {
		return mData.size();
	}
	/**
	 * @see android.widget.Adapter#getView(int, View, ViewGroup)
	 */
	public View getView(int position, View convertView, ViewGroup parent) {
		return createViewFromResource(position, convertView, parent, mResource);
	}
 
       要修改这两个方法,很简单,我们继承SimpleAdapter,然后Override这两个方法:

    public class EndlessSimpleAdapter extends SimpleAdapter{
		private int count ;
		@Override
		public int getCount(){
			count = super.getCount(); //下面要计算。
			return Integer.MAX_VALUE;
		}
		@Override
		public View getView(int position, View convertView, ViewGroup parent){
			//只修改它的position,其实交给父级处理。
			return per.getView(position % count,convertView,parent);
		}
	}
 

   然后,使用EndlessSimpleAdapter向Gallery提供数据,就可以实现无限循环了。

 

    桥下一粒砂 http://chenyoca.iteye.com 原创文章,转载请声明作者。

1 楼 119568242 2011-10-03  
图挂了图挂了图挂了图挂了
2 楼 桥下一粒砂 2011-10-10  
119568242 写道
图挂了图挂了图挂了图挂了


没有挂啊?好好的。
3 楼 xiaozhi6156 2011-10-25  
图挂了~O。O
4 楼 貌似掉线 2011-10-26  
这个不错。
5 楼 pop1030123 2012-01-14  
不错,但是怎么让他自动无限循环滚动呢??
6 楼 119568242 2012-01-14  
pop1030123 写道
不错,但是怎么让他自动无限循环滚动呢??

public int getCount() { 
    return max;  //这里返回Integer.max;



然后
public View getView(int position, View convertView, ViewGroup parent){ 
    //只修改它的position,其实交给父级处理。 
    使用到position的时候先%你的图片数


7 楼 pop1030123 2012-01-16  
119568242 写道
pop1030123 写道
不错,但是怎么让他自动无限循环滚动呢??

public int getCount() { 
    return max;  //这里返回Integer.max;



然后
public View getView(int position, View convertView, ViewGroup parent){ 
    //只修改它的position,其实交给父级处理。 
    使用到position的时候先%你的图片数



办法是不错,但是只实现了无限循环,没有实现自动滚动。
8 楼 桥下一粒砂 2012-01-16  
pop1030123 写道
119568242 写道
pop1030123 写道
不错,但是怎么让他自动无限循环滚动呢??

public int getCount() { 
    return max;  //这里返回Integer.max;



然后
public View getView(int position, View convertView, ViewGroup parent){ 
    //只修改它的position,其实交给父级处理。 
    使用到position的时候先%你的图片数



办法是不错,但是只实现了无限循环,没有实现自动滚动。


这个我没有实现。兄弟你实现了的话,希望告诉我一下,我也需要呢。
9 楼 pop1030123 2012-01-17  
桥下一粒砂 写道
pop1030123 写道
119568242 写道
pop1030123 写道
不错,但是怎么让他自动无限循环滚动呢??

public int getCount() { 
    return max;  //这里返回Integer.max;



然后
public View getView(int position, View convertView, ViewGroup parent){ 
    //只修改它的position,其实交给父级处理。 
    使用到position的时候先%你的图片数



办法是不错,但是只实现了无限循环,没有实现自动滚动。


这个我没有实现。兄弟你实现了的话,希望告诉我一下,我也需要呢。

我最后没用gallery,用了HorizontalScrollView,用scrollBy。
10 楼 lyx2007825 2012-04-19  
pop1030123 写道
桥下一粒砂 写道
pop1030123 写道
119568242 写道
pop1030123 写道
不错,但是怎么让他自动无限循环滚动呢??

public int getCount() { 
    return max;  //这里返回Integer.max;



然后
public View getView(int position, View convertView, ViewGroup parent){ 
    //只修改它的position,其实交给父级处理。 
    使用到position的时候先%你的图片数



办法是不错,但是只实现了无限循环,没有实现自动滚动。


这个我没有实现。兄弟你实现了的话,希望告诉我一下,我也需要呢。

我最后没用gallery,用了HorizontalScrollView,用scrollBy。



我实现了~  看我的博客,用模拟事件可以实现
11 楼 Drakedog 2012-06-29  
实现自动滚动容易啊,最偷懒的办法,起一个线程,每隔一段时间,gallery.setselection(int position)不就行了,哈哈,不过这个是向右无限循环,那向左呢,如果我在第一张,我往左翻,要求显示第四张,怎么办,求教

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
技术文章 iis7站长之家
▪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