Menu Home

Android Activity布局(layout)介绍

LinearLayout LinearLayout——线性布局,顾名思义,LinearLayout中的组件按照线性排列,每一个组件都位于前一个组件的后面。LinearLayout又可以分为水平线性布局和垂直线性布局。 垂直线性布局 在垂直线性布局中,组件从上至下依次排列。可以使用android:layout_weight属性来控制组件占据空间的比例:当layout_width或layout_height设置为0dp的时候,数值越高占据的比例越大;当layout_width或layout_height设置为match_parent时,数值越高占据的比例越小。 <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:orientation=”vertical” > <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:layout_weight=”2″ android:text=”TextView 1″ /> <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:layout_weight=”1″ android:text=”TextView 2″ /> <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:layout_weight=”1″ android:text=”TextView 3″ /> <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:text=”TextView 4″ /> 水平线性布局 水平线性布局中的组件按照水平方向平铺排列,组件所占空间的比例跟layout_weight的值成正比。 <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:orientation=”horizontal” > <TextView android:layout_width=”wrap_content” android:layout_height=”wrap_content” […]

Android Use Camera (一) : 捕捉图像并修改图像属性

git clone https://github.com/lnmcc/CameraExample.git 下面的例子将展示如何通过Camera Intent捕捉图像并修改图像属性的方法。 activity_main.xml: <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:orientation=”vertical” tools:context=”.MainActivity” > <ImageView android:id=”@+id/imgView” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /> <TextView android:id=”@+id/TitleTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Title” /> <EditText android:id=”@+id/TitleET” android:layout_width=”fill_parent” android:layout_height=”wrap_content” /> <TextView android:id=”@+id/DescriptionTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Description” /> <EditText android:id=”@+id/DescriptionET” android:layout_width=”fill_parent” android:layout_height=”wrap_content” /> <Button android:id=”@+id/TakePictureBT” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Take Picture” /> <Button android:id=”@+id/SaveDataBT” […]

MAC OS 利用WIFI共享网络

MAC OS : 10.7.5 应用情景: 华为3G网卡负责外网,利用本机的wifi为其他设备提供共享网络。 打开系统 System Preferences界面,找到Sharing项     Sharing配置界面左侧选择Internet Sharing,只选中,不要打勾。在界面右侧的”Share your connection from”的下拉菜单中选择你需要共享的外网连接(我这里是HUAWEIMobile),然后在”To computers using:”下拉菜单中选择你用来发送共享网络的设备(我这里是Wi-Fi)     在左侧栏的”Internet Sharing”复选框中打勾,弹出下面的对话框后点击”Start”     完成后的状态

让人目瞪口呆的三位世界级电脑大师

公元1998年 在我读高二那年,那还是我用Windows 98的时候有次我系统崩溃了, 因为我那时还是个电脑白痴,我同学帮我介绍了一个电脑高手来帮我修电脑。 他看了一下电脑,问我有没有Windows 98 的光盘?我说没有。 他想了一下,叫我把家里电话拿给他,我心里想说修电脑要电话干什么? 但人家是电脑高手,我也不好意思说什么,就把电话拔下来给他了。 他把电话线空着的一头接在主机版的一个插孔内,然后进入了 DOS, 然后就开始在电话上不停的按着键,他按键的速度非常快,但是他都只按电话的0,1两个键。 我搞不懂这有什么用? 但也不敢问,看了半个多小时,他还是不停的按这两个键。 我渐渐的有些困,我问他这东西要搞多久? 他说还要几个小时,我给他倒了杯咖啡,就一个人去隔壁书房睡觉了。 醒来的时候,一看已经过了5个多小时,我起身到隔壁,看见他正在 Windows 98 里面调试。 过了一会儿,他说,你试试,我坐上椅子用了一下,真的好了。 我当时也不懂电脑,谢过人家就走了。 后来我慢慢对电脑有了一些概念才了解到, 原来当时那位电脑高手是使用机器语言编了一个Windows 98系统从我给他的电话直接输入到硬盘。 我后来问我同学那位高手的下落,我同学说前几年去了美国之后,杳无音讯…. 公元2000年 在我读大一那年,那还是我用Windows Me的时候有次我系统崩溃了, 因为我那时还是个电脑入门,我朋友帮我介绍了一个电脑高手来帮我修电脑。 他看了一下电脑,问我有没有Windows Me 的安装盘?我说没有。 他想了一下,叫我把一张空的DVD刻录盘和一根奈米细针拿给他, 我心里想说修电脑要刻录盘和奈米细针干什么?但人家是电脑高手,我也不好意思说什么。 於是我就把DVD刻录盘拿一张来给他了。 他把奈米细针头对着刻录盘戳,他戳的速度非常快,但是只戳深或浅。 我搞不懂这有什么用?但也不敢问,看了半个多小时,他还是不停的戳着DVD刻录盘。 我渐渐的有些困,我问他这东西要搞多久?他说要几个小时,我给他倒了杯葡萄酒, 就一个人去隔壁客厅沙发上睡觉了。 醒来的时候,一看已经过了6个多小时,我起身到隔壁,看见他正在 Windows Me 里面调试, 还装上了 Office、Photoshop、迅雷、魔兽世界等软件……过了一会儿他说, 你试试,我坐上椅子用了一下,真的好了。 我当时也不懂电脑,谢过人家就走了。 后来我慢慢对电脑有了一些基础,终于明白了,原来当时那位电脑高手是用奈米细针头刻了一个单面双层的DVD , […]

adb常用命令

设置标准输出和标准错误输出 Android系统默认把标准输出和标准错误输出(system.out和system.err)定向到/dev/null。使用下面的命令更改: $ adb shell stop $ adb shell setprop log.redirect-stdio true $ adb shell start 查看内存分配情况 $ adb shell dumpsys meminfo <package name> 重新安装apk adb install -r 包名 卸载apk adb uninstal 包名 注意这里的参数是包名,即AndroidManifest中package的属性值。

使用Android接口描述语言(AIDL)

AIDL简介 Andorid提供了一种轻量级的进程间通信机制:接口描述语言(Android Interface Definition Language),简称AIDL。进程间使用AIDL通信跟使用Intent通信的最大区别在于:前者是同步通信,而后者是异步通信。AIDL的语法与JAVA中的Interface十分相似,对数据类型的支持方面有一些差别,目前AIDL支持的数据类型有: Java中的基本数据类型 String List CharSequence Map 其他AIDL生成的接口 实现了Parcelable接口并通过值传递的自定义类型 使用AIDL的步骤 创建.aidl文件,在文件中声明远程服务的接口 在.java文件中实现.aidl中声明的方法 在AndroidMainifest中注册上面创建的服务 客户端请求绑定服务成功后就可以调用.aidl中声明的方法了 示例解析 项目目录结构: 在项目src文件夹下创建IAddService.aidl文件,在aidl声明了一个addOne方法,这个方法简单的把传入的值加上一。 IAddService.aidl: package net.lnmcc.aidltest.aidl; interface IAddOneService { int addOne(int value); } 保存.aidl文件后,Eclipse将会自动在gen/文件夹下生成一个IAddService.java文件,在后面实现远程服务的时候会使用到其中的抽象类Stub。 创建AddService,AddService是一个bound服务,需要实现onBind()方法,它将返回一个IAddService.Stub实例。IBinder简单的理解成进程间通信的通道,可以通过这个通道来实现数据传输。 AddService.java: public class AddService extends Service { IAddService.Stub mBinder; @Override public void onCreate() { super.onCreate(); mBinder = new […]

Android增加Happy Touch触摸屏支持

1、在hid-ids.h中加入vid pid #define USB_VENDOR_ID_HAPPYTOUCH 0x0416 #define USB_DEVICE_ID_HAPPYTOUCH_SCREEN 0x5030 2、在hid-multitouch.c->mt_devices[] 中加入 { .driver_data = MT_CLS_DEFAULT, HID_USB_DEVICE(USB_VENDOR_ID_HAPPYTOUCH, USB_DEVICE_ID_HAPPYTOUCH_SCREEN) } 3、在hid-core.c->hid_have_special_driver[]中加入HID_USB_DEVICE(VID,PID) { HID_USB_DEVICE(USB_VENDOR_ID_HAPPYTOUCH,USB_DEVICE_ID_HAPPYTOUCH_SCREEN)} 4、设置kernel编译变量 $ export ARCH=arm $ export SUBARCH=arm $ export CROSS_COMPILE=arm-eabi- 5、在内核的config文件中,确认驱动中是否添加了hid-multitouch模块 运行make menuconfig后,将HID Multitouch panels选上。 $ make clear $ make mrproper $ make menuconfig Device Drivers —> HID Devices —> […]

sqlite的基本用法

介绍 SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑。 数据库操作 查询已有数据库 $ sqlite > .databases 创建数据库 $ sqlite test.db 如果数据库已经存在了,则打开数据库。 创建表 sqlite> create table mytable(id integer primary key, value text); sqlite>为sqlite的命令行提示符 查看数据库中存在的表 $ sqlite .tables 往表中插入数据 sqlite> insert into mytable(id, value) values(1, ‘Micheal’); sqlite> insert into mytable(id, value) values(2, ‘Jenny’); sqlite> insert into […]

为Android app添加最终用户许可协议(EULA)

对一个android app来说,加入EULA已经是一个必不可少的内容了。下面将演示如何创建一个通用的Eula类。任何一个app都可以使用Eula.show()来显示自己的EULA,也可以通过实现Eula.OnEulaAgreedTo接口做进一步处理。 Eula.java /** 最终用户协议文件名由ASSERT_EULA定义,存放位置为项目的assets目录 */ public class Eula { private static final String ASSERT_EULA = “EULA”; private static final String PREFERENCE_EULA_ACCEPTED = “eula.accepted”; private static final String PREFERENCE_EULA = “eula”; /** 当用户选择同意后的回调函数。 */ static interface OnEulaAgreedTo { void onEulaAgreedTo(); } private static void accept(SharedPreferences preferences) { preferences.edit().putBoolean(PREFERENCE_EULA_ACCEPTED, true).commit(); } […]

Android音频之SoundPool

Android提供了两种不同的框架来处理音频,分别是: MediaPlayer / MediaRecoder:处理音频的标准方法,但数据源必须是文件或者基于流的数据。使用这个类处理音频文件的时候须有创建自己的线程运行。本文要说的SoundPool类就是使用了这个框架。   AudioTrack / AudioRecoder:该框架支持直接访问原始音频文件。用于在内存中处理音频文件,或者开始播放音频的同时写入缓冲区,或者在其他不需要文件和数据流的场合中使用。运行过程中不需要创建新线程。 SoundPool 和MediaPlayer主要用来播放一些长音频不同,SoundPool一般用来处理一些短的但是带有重叠,回放等特效的音频。这是因为SoundPool带有一个音频缓冲区,可以很方便的支持音频的回放、快放和慢放。 使用SoundPool的基本步骤 初始化 加载资源 播放 释放资源 测试SoundPool 我在测试过程中发现不能播放大于1M的音频文件,所以这里使用一个900K的sound.wav做测试。在点击Play后,音乐将重复播放5次(mySP.play(soundId, 1f, 1f, 1, 5, rate)中的第5个参数指定),每重复点击Play按钮,音乐会降低一半速率播放(mySP.play(soundId, 1f, 1f, 1, 5, rate)中的第6个参数指定)。测试程序同时最大可以叠加10个音频(SoundPool(10, AudioManager.STREAM_MUSIC, 0)中的第1个参数指定)。 public class AudioExamplesSP extends Activity { static float rate = 2f; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button playButton […]

ubuntu下编译ImageMagick使支持JPEG

OS : ubuntu 12.04 (32bit) ImageMagick ver : 6.8.4 ubuntu 12.04默认使用的是JPEG-8,但是ImageMagick-6.8.4需要JPEG-9。使用默认configure编译ImageMagick后,每当需要处理jpeg文件时,IMageMagick报错: Magick: Wrong JPEG library version: library is 80, caller expects 90 解决方法如下: 下载编译安装JPEG-9,下载地址http://www.ijg.org/ 。编译并安装到默认位置:/usr/local/ 使用下面的配置,重新编译ImageMagick-6.8.4,并且安装 $ ./configure CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib –disable-static –with-quantum-depth=8 进入/usr/local/lib/下,查看一下libMagickCore-6.Q8.so的依赖库: $ ldd libMagickCore-6.Q8.so | grep -i jpeg 输出: libjpeg.so.9 => /usr/local/lib/libjpeg.so.9 (0xb711f000) libjpeg.so.8 => /usr/lib/i386-linux-gnu/libjpeg.so.8 (0xb67cb000) 结果显示ImageMagick已经正确连接到jpeg-9。 […]

Android使用多点触摸(一)

Android触摸事件分类 事件名 动作 ACTION_DOWN 按下第一个点 ACTION_POINTER_DOWN 按下第二个点 ACTION_MOVE 手势发生移动 ACTION_POINTER_UP 释放第二个点 ACTION_UP 释放第一个点 简单示例 activity_multitouch.xml <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:paddingBottom=”@dimen/activity_vertical_margin” android:paddingLeft=”@dimen/activity_horizontal_margin” android:paddingRight=”@dimen/activity_horizontal_margin” android:paddingTop=”@dimen/activity_vertical_margin” tools:context=”.Multitouch” > <ImageView android:id=”@+id/imageView” android:contentDescription=”@string/DESC” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:src=”@drawable/aywdhz8u” android:scaleType=”matrix” > </ImageView> </RelativeLayout> Multitouch.java public class Multitouch extends Activity implements OnTouchListener{ Matrix matrix = new Matrix(); Matrix […]

mac os下编译android源代码

Mac OS: 10.7.5 在MacOS上编译android源码的前提是你所使用的文件系统必须是 大小写敏感 的。下面的内容旨在说明如何在不破坏原有文件系统的基础上建立一个供编译android使用的文件系统。 检查你现有的文件系统 依次打开 GO —-> Utilities —-> Disk Utility.app查看当前磁盘的格式,如下图: 在左侧栏中选中你希望在上面编译android的那块磁盘,查看右侧栏中的“Format”一项,如果format格式中带有“Case-sensitive”字样,那么恭喜你,你不需要再做任何操作即可开始编译android源码了,否则,继续往下操作。 确定磁盘空间 当然最方便的方法是把整个磁盘都重新格式成大小写敏感的文件系统,然后重新安装系统。但那样做的成本比较高并且很浪费时间。这里要谈的是不破坏原有系统的前提下,创建一块只供编译android的文件系统。首先需要确保你磁盘的剩余空间在30G以上,编译整个android大概会使用掉25G空间(Google官方显示至少25G)。 创建磁盘镜像 打开一个Terminal,输入如下命令: $ hdiutil create -type SPARSE -fs ‘Case-sensitive Journaled HFS+’ -size 60g YOU_FOLDER/android.dmg 这条命令在你所指定的文件夹中(YOU_FOLDER)创建了一个大小写敏感的可以自增长的最大为60GB的镜像。查看你的文件夹出现了新文件android.img.sparseimage。接下来把这个镜像挂载到系统: $ hdiutil attach ./android.dmg.sparseimage -mountpoint /Volumes/android 这条命令把上一步中创建的android.dmg挂载到了/Volumes/android下,以后这里就是我们编译android的地方。如果你希望每次开机的时候系统自动挂载这个镜像,你可以把下面的命令放到你的~/.profile中。 $ hdiutil attach YOU_FOLDER/android.dmg.sparseimage -mountpoint /Volumes/android 接下来就是把down下来的android源码拷贝到/Volumes/android目录下进行编译。

Android 使用CountDownTimer

在onResume()方法中构造CountDownTimer的好处是,onResume()是在onRestoreInstanceState()之后执行的, 这样就可以在onRestoreInstanceState()中恢复上次倒计时后的剩余时间,这样在手机屏幕旋转后,倒计时不会重置。关于详细的Activity方法调用时序,请 点击这里。 MainActivity.java package com.example.countdowntimeexample; import android.os.Bundle; import android.os.CountDownTimer; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.TextView; public class MainActivity extends Activity { private TextView mTimeLabel; CountDownTimer myTimer; long myTime = 30000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTimeLabel = (TextView) findViewById(R.id.text); } @Override protected void onResume() […]

Java线程同步方法

CountDownLatch CountDownLatch主要用来等待一系列线程都完成后,再继续下一步的执行,类似于C++中的join。 import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CountDownLatchExample { public static void main(String[] args) { ExecutorService pool = Executors.newCachedThreadPool(); final CountDownLatch doneLatch = new CountDownLatch(10); for(int i = 0; i < 10; i++) { Runnable runnable = new Runnable() { @Override public void run() { try { […]

Android activity生命周期

Activity生命周期转换图 onCreate(Bundle): Activity生成时调用。如果存在使用OnSaveInstanceState方法保存的信息,将把保存的信息传递给OnCreate的Bundle参数。 onStart(): 在Activity即将显示的时候调用。 onResume(): 当Activity可以接受用户输入的时候调用。它是开始播放媒体文件的一个很好的时间点。 onPause(): Activity转入后台时调用。如果在调用这个方法之后,系统内存不足,这个Activity进程可能被终止掉。 onStop(): 暂时不使用Activity时调用这个方法(可能时因为其他Activity启动或者程序即将结束时)。如同onPause()一样:当内存不足时,系统可能会直接终止进出,而不调用这个方法。 onRestart(): 调用onStop后,再次显示这个Activity时调用。 onDestroy(): Activity即将终止时调用。如同onPause()一样:当内存不足时,系统可能会直接终止进出,而不调用这个方法。 onSaveInstanceState(Bundle): 保存实例的状态时调用。这里使用Bundle参数来保存值。当因为内存不足等原因而造成程序终止时,这个函数所保存的值能继续作为参数传递给onCreate()和onRestoreInstanceState(),因此,再次启动程序时就能利用这个传递给Bundle的值恢复之前的状态。 onRestoreInstanceState(Bundle): 在恢复实例的状态时调用。通过参数Bundle,可以获取通过onSaveInstanceState()保存的值,这个值与传递给onCreate()的内容相同。虽然采取任何一种方法进行恢复处理都没有问题,但是onRestoreInstanceState的处理方式跟自然。 Activity方法调用时序              ref: http://developer.android.com/guide/components/activities.html ref:《Android开发秘籍》 顺便推荐一款好用的在线UML工具: http://www.websequencediagrams.com/

Java语言中的静态类

在写Android程序的时候,系统会自动生成一个R.java,这个类中使用了大量的静态类,对一个C++程序员来说,这是个新鲜事物,下面来看看这个神奇的玩意。 静态内部类的语法 public class ExternalClass { public static final class InnerClass { //… } } 静态内部类的作用 一般情况很少会用到静态类,但它也并不是一无是处,不然Java也就不会引入这个语法了。静态内部类的一个最大的用处出现在对Java类的测试中,例如: public class Test { public static void main(String[] args) { Other.Test.printx(); } } class Other{ static class Test { Other o = new Other(); o.printx(); } public void printx() { System.out.println(“Other class”); } […]

Java语言中的异常处理

java异常分类 异常类层次 Throwable Java中所以的异常都是有Throwable继承而来。 Error Error类层次结构描述了JAVA运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的错误对象。如果程序出现了这样的内部错误,除了通告给用户,并尽力使程序安全终止之外,再无能为力。这种情况很少出现。 Exception 在设计JAVA程序时,需要关注Exception层次结构。这个层次结构又分为两个分支: Runtime Exception 由程序错误导致的异常属于Runtime Exception,相当于C++中的logic_error类。如果出现“Runtime Exception”异常,那么就一定是你的问题。应该通过检测数组下表是否越界来避免ArrayIndexOutOfBoundsException异常;应该通过在使用变量之前检测是否为空来杜绝NullPointerException异常的发生。派生于Runtime Exception的异常包含下面几种情况: 错误的类型转换 数组访问越界 访问空指针     IOException 派生于IOException的异常包含下面几种情况: 试图在文件尾部后面读取数据 试图打开一个错误格式的URL 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在 未检查异常和已检查异常     未检查异常 Java语言规范将派生于Error类或RuntimeException类的所以异常称为“未检查异常(unchecked exception)”。     已检查异常 除上面所述的未检查异常外的所以异常都称为“已检查异常(checked exception)”。编译器将核查是否为所有的已检查异常提供了异常处理器。 声明异常 方法应该在其首部使用throws关键字声明所有可能抛出的异常。例如: public FileInputStream(String name) throws FileNotFoundException 当一个方法有可能抛出多个已检查异常时,那么必须在方法的首部列出所有的异常类。例如: class MyClass { public void MyMethod(String s) throws EOFException, IOException { //… … […]

nvidia显卡的xorg配置

生成xorg配置 如果发现系统/etc/X11/xorg.conf文件丢失,你可以使用下面的命令生成一个新的xorg.conf文件 $ X –configure 新生成的xorg.conf.new一般在用户目录下,具体路径请查看输出结果,得到xorg.conf.new文件后需要把它拷贝到/etc/X11/下,并且更改文件名为xorg.conf。如果这个自动生成的文件不符合需求就需要根据具体情况做相应的修改。当然,更方便的方法就使从别的机器上拷贝/etc/X11/xorg.conf到你的系统中,针对Nvidia显卡的xorg配置都使通用的,然后再做相应的修改。 单屏xorg的配置 xorg.conf内容 # nvidia-xconfig: X configuration file generated by nvidia-xconfig # nvidia-xconfig: version 260.19.44 ([email protected]) Sun Feb 27 21:50:39 PST 2011 Section “ServerLayout” InputDevice “irtouch” “SendCoreEvents” Identifier “Layout0” Screen 0 “Screen0” InputDevice “Keyboard0” “CoreKeyboard” InputDevice “Mouse0” “CorePointer” Option “Xinerama” “0” EndSection Section “Files” EndSection […]

android程序调用JNI

OS: MAC OS 10.7.5 Android: 4.3 NDK: android-ndk-r7c java: 1.6.0_51 使用JNI 在Eclipse中新建一个Android工程,假设项目目录为project,修改activity_main.xml 如下: <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:paddingBottom=”@dimen/activity_vertical_margin” android:paddingLeft=”@dimen/activity_horizontal_margin” android:paddingRight=”@dimen/activity_horizontal_margin” android:paddingTop=”@dimen/activity_vertical_margin” tools:context=”.MainActivity” > <TextView android:id=”@+id/showText” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /> </RelativeLayout> MainActivity.java: package net.lnmcc.usejni; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { // 加载JNI库 static […]

使用命令行工具构建android apk

新建工程 查看构建目标 输入下面的命令查看所以可构建目标: $android list targets 可能的输出: Available Android targets: ———- id: 1 or “android-3” Name: Android 1.5 Type: Platform API level: 3 Revision: 4 Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P ABIs : armeabi ———- id: 2 or “Google Inc.:Google APIs:3” Name: Google APIs Type: Add-On Vendor: Google Inc. […]

WordPress twentytwelve主题:修改页面宽度

WordPress twentytwelve主题:修改页面宽度 Wordpress twentytwelve theme以简洁取胜,但是这个主题是固定页面宽度的(默认值为960),如果网站上放置的东西多一点就会显得拥挤不堪,破坏了其整体整洁性,下面介绍的方法可以很方便的更改这个主题的宽度: 打开主题的style.css文件(可以使用WP后台编辑也可以直接进主机目录修改 一个可能的路径 /var/www/wordpress/wp-content/themes/twentytwelve 查找下面的内容(在我的主机上是在655行) /* Footer */ footer[role=”contentinfo”] { border-top: 1px solid #ededed; clear: both; font-size: 12px; font-size: 0.857142857rem; line-height: 2; max-width: 960px; max-width: 68.571428571rem; margin-top: 24px; margin-top: 1.714285714rem; margin-left: auto; margin-right: auto; padding: 24px 0; padding: 1.714285714rem 0; } 把其中的max-width修改成符合你要求的数值,px和rem之间的换算关系可以简单的用px / 14来计算,比如1000px / 14 […]

基于QWebView的浏览器Widget (DEMO)

OS : ubuntu 12.04 QT : 4.8.4 //测试时发现QT5的QWebView在加载Flash时会出现黑块,速度也比4.8慢很多。 如果有不能打开网页图片的情况,可能是因为你的QT找不到图片插件,解决方法如下:  导入QT图片插件路径:  export QT_PLUGIN_PATH=/usr/lib/qt4/plugins  拷贝图片插件到工程目录:  cp -av /usr/lib/qt4/plugins/imageformats/ ~/Projects/browser <—-你自己的工程目录 BrowserWidget.pro #只是一个Demo用以测试QWebView QT += core gui webkit webkitwidgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = BrowserWidget TEMPLATE = app SOURCES += main.cpp \ MyWebView.cpp \ MyBrowser.cpp HEADERS += \ MyWebView.h \ MyBrowser.h […]