当前位置:  编程技术>移动开发
本页文章导读:
    ▪本土方法调用3        本地方法调用3     继续本地调用的相关知识。前面已经讲过了关于java如何调用下面的相关知识,包括如何适配变量,jni调用的方法规范,以及一些jni方法调用的注意事项等等。    根.........
    ▪ 自动调整TextView字体大小以顺应文字长度        自动调整TextView字体大小以适应文字长度 package me.mcar.parking.control; import android.content.Context; import android.graphics.Paint; import android.util.AttributeSet; import android.widget.TextView; public class AutoAjustSizeTextVi.........
    ▪ Sencha touch、JQuery Mobile抉择       Sencha touch、JQuery Mobile取舍  jquery mobile和sencha touch是两个不错的HTML 5开发框架,下面小结两者的一些 特点如下 jquery mobile: 1) jQM是一个UI类库可以看作,主要依赖于jquery和jquery ui 2) jqm做的一些.........

[1]本土方法调用3
    来源: 互联网  发布时间: 2014-02-18
本地方法调用3
    继续本地调用的相关知识。前面已经讲过了关于java如何调用下面的相关知识,包括如何适配变量,jni调用的方法规范,以及一些jni方法调用的注意事项等等。
    根据前面的介绍,我们可以发现,调用的过程,如果真的使用起来,并没有很顺手,因为仅仅只有参数的向下传递是绝对不够的。我们不仅要下层的代码访问上层的,还要来回调用彼此之间的方法,这样做才够cool嘛。而且才能灵活满足各种需求。就像佛经所说:能进能退,乃真正法器(形容能进能退,进退有度,赵云式的霸气),有木有?
    那先来介绍下访问实例域吧。在java程序中,有很多方法,会使用到类中的全局变量,比如下面的代码:
class Employee{
    double salary = 0;
    
    public void raiseSalary(double byPercent){
        salary += 1 + byPercent / 100;
    }
}

    很常见的方法吧?现在呢,我们要把这个raiseSalary变成一个本地方法。根据前面内容,javah可以生成一个如下方法
JNIEXPORT void JNICALL Java_Employee_raiseSalary(JNIEnv *, jobject, jdouble)

    看到这个方法,你能看出和先前讲得有什么不同么?什么?能进能退?我代表赵云,给你跪了。。。咳,我们看到,有两个不同处,第一个,salary变量是一个Employee的变量,并没有被通过参数传入到c层中。这个我们要稍后重点介绍。还有一个,看看第二个传入参数,可以看到,前面由于使用的是static静态方法,所以,传递进来的是jclass,而这里,我们看到传进来的是jobject。这个也很合理,因为静态方法是没有对象的嘛。
    好了,有java对象传下来,后面就很好想象了,对吧。不过,直接访问要求虚拟机暴露它们的内部数据布局,因此,JNI要求程序员通过调用特殊的JNI函数来获取和设置数据的值。这里我们要使用GetdoubleField和SetDoubleField函数,当然还有其他类型,一般语法是:
x = (*env)->GetXxxField(env, this_obj, fieldID);
(*env)->SetXxxField(env, this_obj, fieldID, x);

    这里,又产生了两个疑问,一个是fieldID是个什么东东?还有,GetObjectField方法返回的对象,我们用什么class定义它?
    先看看FieldID,它是一个特殊类型的值,fieldID表示结构中的一个域。使用GetFieldID函数来获得fieldID。
    jfieldID id_salary = (*env)->GetFieldID(env, class_Employee, "salary", "D");

    字符串"D"表示类型是double。这个后面介绍。
    感觉有点像纹理id有没有?JNI的设计者不想把数据域直接暴露在外,所以,他们不得不提供获取和设置数据域值的函数。为了使这些函数的开销最小化,从域名计算域ID(代价最大的一个步骤)被分解出来作为单一步骤。这样,如果你反复获取和设置一个特定的域,你计算域标示符的开销只有一次。
    第二点,如何得到一个class?jni有两种方式得到class:
   
jclass class_Employee = (*env)->GetObjectClass(env, this_obj);

    FindClass函数可以让你以字符串形式来指定类名(很奇怪的是使用/来代替包分割符号.)
   
jclass class_String = (*env)->FindClass(env, "java/lang/String");

    看起来有点像反射,是吧。(越往后看,其实jni的java层的method调用也是反射的形式,他们分别对应了反射的field和method)
    好了,大概介绍完了如何访问java的域,我们最后做个总结,把开始的方法完全转换成jni层的代码:
JNIEXPORT void JNICALL Java_Employee_raiseSalary(JNIEnv* env, jobject this_obj, jdouble byPercent){
    jclass class_Employee = (*env)->GetObjectClass(env, this_obj);
    jfieldID id_salary = (*env)->GetFiledID(env, class_Employee, "salary", "D");
    jdouble salary = (*env)->getDoubleField(env, this_obj, id_salary);
    salary += 1 + byPercent;
    (*env)->SetDoubleField(env, this_obj, id_salary, salary);
}

    
[2] 自动调整TextView字体大小以顺应文字长度
    来源: 互联网  发布时间: 2014-02-18
自动调整TextView字体大小以适应文字长度
package me.mcar.parking.control;

import android.content.Context;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;

public class AutoAjustSizeTextView extends TextView
{
	private static float DEFAULT_MIN_TEXT_SIZE = 10;
	private static float DEFAULT_MAX_TEXT_SIZE = 16;

	// Attributes
	private Paint testPaint;
	private float minTextSize, maxTextSize;

	public AutoAjustSizeTextView(Context context, AttributeSet attrs)
	{
		super(context, attrs);
		
		initialise();
	}

	private void initialise()
	{
		testPaint = new Paint();
		testPaint.set(this.getPaint());

		 
		maxTextSize = this.getTextSize();

		if (maxTextSize <= DEFAULT_MIN_TEXT_SIZE)
		{
			maxTextSize = DEFAULT_MAX_TEXT_SIZE;
		}

		minTextSize = DEFAULT_MIN_TEXT_SIZE;
	};

	/**
	 * Re size the font so the specified text fits in the text box * assuming
	 * the text box is the specified width.
	 */
	private void refitText(String text, int textWidth)
	{
		if (textWidth > 0)
		{
			int availableWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight();
			float trySize = maxTextSize;
			testPaint.setTextSize(trySize);
			while ((trySize > minTextSize) && (testPaint.measureText(text) > availableWidth))
			{
				trySize -= 1;
				if (trySize <= minTextSize)
				{
					trySize = minTextSize;
					break;
				}
				testPaint.setTextSize(trySize);
			}
			this.setTextSize(trySize);
		}
	};

	@Override
	protected void onTextChanged(CharSequence text, int start, int before, int after)
	{
		super.onTextChanged(text, start, before, after);
		refitText(text.toString(), this.getWidth());
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh)
	{
		if (w != oldw)
		{
			refitText(this.getText().toString(), w);
		}
	}
}


控件使用方法

<me.mcar.parking.control.AutoAjustSizeTextView
            android:id="@+id/parklist_item_address"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:textColor="#A0A0A0"
            android:textSize="12sp" />

    
[3] Sencha touch、JQuery Mobile抉择
    来源: 互联网  发布时间: 2014-02-18
Sencha touch、JQuery Mobile取舍

 jquery mobile和sencha touch是两个不错的HTML 5开发框架,下面小结两者的一些 
特点如下 


jquery mobile: 
1) jQM是一个UI类库可以看作,主要依赖于jquery和jquery ui 
2) jqm做的一些页面是可以靠JQM本身框架已完成不少功能,甚至不需要或者 
很少的javascript 

3) 如果是熟JQUERY的话,JQM很容易上手 
4) JQM是结构框架上比较松散,所以程序大的时候维护起来稍微麻烦点 
5) 能容易跟其他框架整合 
6) 支持的设备比sencha touch暂时多点 


sencha touch: 
1) 框架类库很大,包罗万有,UI,DOM,AJAX等它都包括了 
2) 不依赖其他框架类库 
3) 学习起来花费时间长点 
4) 有很好的框架规范和编程约束,这对中大规模项目来说是好事 
5) 提供原生打包(native packaging)功能。只需一条命令,就可以将应用打包为供iOS或Android使用。用户不必编写自己的包裹器,或是再纠缠于其他,现在已经在Sencha Touch 2中全面内置。更好之处在于:用户为iOS或Android打包同时支持Mac和Windows环境。 
6) 支持的设备比jqm少些 
7) 对localstorage的支持好点


    
最新技术文章:
▪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