时间好快啊,一个月过去了,我也一个月没出过高新园区了,之前很想去北上广,但因为还没毕业,其实是不舍得我女朋友了,所以决定暂时留在大连了,呵呵,在一个小公司,才7个人,这里的都是廉价工人,的确很便宜,但是也很没能力,一点游戏经验都没有,我是一个初出茅庐的小屁孩,连我都感觉不出他们的专业水平,一个个都毕业这么多年了,UI一看上去就感觉很次,也敢拿出来,动画这么次也敢满足,一个个的都有脾气,连和老板说话的语气都这么冲,我都无语了,我不知道为什么老板要养这么一帮人啊,一个月过去了,进度太慢了,不知道还能撑多久。
公司无人,所以我就是“主程”了,我又没经验,所以我压力山大,而且进程比较慢,之前我对整个工程的管理做的很不好,来一点东西又随便扔进去,反正很乱,到最后一个个效果是达到了,但是资源很乱,花了我一天的时间才整理好,所以大家要养成好习惯哈,把资源管理好;虽然我很讨厌那些板着脸的美工,但是我感觉合作是很重要的,没办法只能忍忍了;由于美工给我的模型出问题了,我当时很笨把每个场景的模型都一个个换了,然后又一个个绑定脚本组件,第二天才发现有个很简单的方法,那就是把这个模型的mesh换成新的就行了,我笨的要死,浪费了我两小时的时间,哎~~~最近大脑不灵活了,10秒钟之前想的事,10秒后就忘了,这几天很多次很多次了,看来该睡午觉了;好想有个高手在这,我就能学到很多东西了,哎~~~等9月份再看看吧~~~~
这一个月,得到的是一点点经验,失去的是生命,呵呵~~~~~
2楼aboy123前天 10:27经验不好积累啊1楼beijiguangyong前天 20:29人生重要的是经历Re: dlnuchunge前天 09:06是的啊,一看您就知道是经历,阅历无数的人,呵呵~~~,我会加油的~~~我在项目中用到了二维码扫描的技术,用的是Google提供的ZXing开源项目,它提供二维码和条形码的扫描。扫描条形码就是直接读取条形码的内容,扫描二维码是按照自己指定的二维码格式进行编码和解码。
可以到http://code.google.com/p/zxing/下载ZXing项目的源码,然后按照官方文档进行开发,我这里使用的ZXing是经过简化版的,去除了一些一般使用不必要的文件,项目工程截图如下:
其中encoding包是我在它的基础上自己加上去的,功能是根据传入的字符串来生成二维码图片,返回一个Bitmap,其余的包是ZXing项目自带的。另外对扫描界面的布局我也进行了修改,官方的扫描界面是横向的,我改成了纵向的,并加入了顶部的Tab和取消按钮(camera.xml),另外还需要的一些文件是colors.xml、ids.xml,这些都是原本ZXing项目中自带的,最后就是libs下面的jar包。
先来看看最后的效果:
首先是根据输入的字符串生成二维码图片(左图),然后扫描二维码图片可以在界面上显示扫描结果(右图):
点击Open Camera按钮代开扫描框(左图),扫描条形码结果如下(右图):
接下来看如何使用,首先是把ZXing项目中的一些文件拷贝到我们自己的项目中,然后在Mainifest文件中进行配置权限:
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />还有就是扫描界面Activity的配置:
<activity android:configChanges="orientation|keyboardHidden" android:name="com.zxing.activity.CaptureActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateAlwaysHidden" > </activity>接下来是我自己项目的布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/white" android:orientation="vertical" > <Button android:id="@+id/btn_scan_barcode" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:text="Open camera" /> <LinearLayout android:orientation="horizontal" android:layout_marginTop="10dp" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/black" android:textSize="18sp" android:text="Scan result:" /> <TextView android:id="@+id/tv_scan_result" android:layout_width="fill_parent" android:textSize="18sp" android:textColor="@android:color/black" android:layout_height="wrap_content" /> </LinearLayout> <EditText android:id="@+id/et_qr_string" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:hint="Input the text"/> <Button android:id="@+id/btn_add_qrcode" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Generate QRcode" /> <ImageView android:id="@+id/iv_qr_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_gravity="center"/> </LinearLayout>
public class BarCodeTestActivity extends Activity { /** Called when the activity is first created. */ private TextView resultTextView; private EditText qrStrEditText; private ImageView qrImgImageView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); resultTextView = (TextView) this.findViewById(R.id.tv_scan_result); qrStrEditText = (EditText) this.findViewById(R.id.et_qr_string); qrImgImageView = (ImageView) this.findViewById(R.id.iv_qr_image); Button scanBarCodeButton = (Button) this.findViewById(R.id.btn_scan_barcode); scanBarCodeButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //打开扫描界面扫描条形码或二维码 Intent openCameraIntent = new Intent(BarCodeTestActivity.this,CaptureActivity.class); startActivityForResult(openCameraIntent, 0); } }); Button generateQRCodeButton = (Button) this.findViewById(R.id.btn_add_qrcode); generateQRCodeButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { String contentString = qrStrEditText.getText().toString(); if (!contentString.equals("")) { //根据字符串生成二维码图片并显示在界面上,第二个参数为图片的大小(350*350) Bitmap qrCodeBitmap = EncodingHandler.createQRCode(contentString, 350); qrImgImageView.setImageBitmap(qrCodeBitmap); }else { Toast.makeText(BarCodeTestActivity.this, "Text can not be empty", Toast.LENGTH_SHORT).show(); } } catch (WriterException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //处理扫描结果(在界面上显示) if (resultCode == RESULT_OK) { Bundle bundle = data.getExtras(); String scanResult = bundle.getString("result"); resultTextView.setText(scanResult); } } }
其中生成二维码图片的代码在EncodingHandler.java中:
public final class EncodingHandler { private static final int BLACK = 0xff000000; public static Bitmap createQRCode(String str,int widthAndHeight) throws WriterException { Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); BitMatrix matrix = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight); int width = matrix.getWidth(); int height = matrix.getHeight(); int[] pixels = new int[width * height]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (matrix.get(x, y)) { pixels[y * width + x] = BLACK; } } } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, width, 0, 0, width, height); return bitmap; } }
最后是在哪里对扫描结果进行解码,进入CaptureActivity.java找到下面这个方法便可以对自己对结果进行操作:
/** * Handler scan result * @param result * @param barcode */ public void handleDecode(Result result, Bitmap barcode) { inactivityTimer.onActivity(); playBeepSoundAndVibrate(); String resultString = result.getText(); //FIXME if (resultString.equals("")) { Toast.makeText(CaptureActivity.this, "Scan failed!", Toast.LENGTH_SHORT).show(); }else { // System.out.println("Result:"+resultString); Intent resultIntent = new Intent(); Bundle bundle = new Bundle(); bundle.putString("result", resultString); resultIntent.putExtras(bundle); this.setResult(RESULT_OK, resultIntent); } CaptureActivity.this.finish(); }
以上过程没有把每一步的详细步骤写出来,整体思路基本大致如上,源码下载:源码
欢迎关注我的新浪微博和我交流:@唐韧_Ryan
Android设备多种多样,不同机型配备的屏幕尺寸也是有大有小、形状各异。而Android开发人员为了保证应用程序中的文字以美观顺畅的阅读效果呈现给用户,必须要针对各类屏幕尺寸设计合适的显示方案。
AD:
教程详解
-
技术应用: AndroidOS / Android SDK
-
难易程度: 简单
-
预计完成时间: 15分钟
【51CTO译文】在本文中,我们将介绍一些简单的处理方式,帮助开发人员轻松编写出能够应对各类设备型号的应用程序文本方案,同时为用户提供自定义文字尺寸功能。别担心,整个过程没什么难度,只要一步步按指南进行操作,大家再也不用为调整显示效果而劳心伤神了。
在这篇上手教程中,我们将讨论一些实用性步骤,指引开发人员在拥有足够灵活性的前提下保证文字清晰易读,同时使自己的产品能够适应多种屏幕类型及各类用户显示设定。
用户如何按需求配置字体设定
首先要强调一点,某些用户可能存在视力障碍甚至几近失明,他们无法顺利阅读一般尺寸下的文字内容。Android操作系统意识到了这些情况,并提供了一套显示辅助功能,使得用户可以根据自己的使用习惯随意缩放设备中文本字体的大小。
要在设备上修改字体设定,首先启用“设定”应用,然后选择“显示”项下的“字体尺寸”。用户可以在设备预置的四种文本字体尺寸中选择适合自己的方案(包含小、正常、大、超大),详见图一。
使用动态字体尺寸
如果大家希望自己的应用文字能够根据用户偏好设置进行灵活调整,则需要使用SP(即可缩放点)单位对文本字体尺寸加以定义。Android平台允许我们通过各种方式为各种显示要素的尺寸赋值。而在文本尺寸方面,我们一般推荐使用诸如DP(与设备无关的像素)及SP为显示密度进行单独设定。SP单位在文字尺寸方面表现最佳,因为它能够完全按照用户的显示设定调整实际效果。
以下内容就是我们在SP单位中利用TextView(即文本显示)功能定义字体尺寸:
而在标题、首行文本或者滚动文本框方面,我们往往不希望用户的偏好设定给显示效果带来影响。在这类情况下,大家就应该尝试DP单位,因为它完全根据设备的像素密度调整显示,而不涉及任何用户偏好设定。
使用固定像素尺寸
如果大家希望自己的应用文本在任何情况下都保持同样的尺寸,那么PX单位的固定像素尺寸功能会帮上大忙。虽然有时候这么做会使默认字体尺寸在某些设备上难以阅读,但如果大家有充分的理由坚持这一点,那么禁用文本内容缩放或尺寸变更还是有必要的。在这类情况下,大家不妨利用绝对尺寸值为字体设计大小,例如指定文字的像素显示数量。
在下面的文本框中,我们利用像素(简称PX)单位为字体设置固定的尺寸。通过这种方式,文本内容会严格按照我们的定义进行显示,而不会被用户的偏好设置或者其它干扰因素所影响。
使用标准系统字体尺寸
Android平台定义了一套普遍适用的字体尺寸方案,我们可以将其直接套用到自己的应用程序当中:小、中、大三种选项基本能够满足各类用户需求。这些字体尺寸以SP单位为基础配置而成,因此会随着用户的偏好设置而发生变更。
下面的XML定义了三种文本框控制类型,一种会显示小字体、一种显示中字体、第三种则显示大字体。
现在让我们将前面提到的内容综合起来,并在“冰淇淋三明治”版本的Android设备上看看文本框的实际显示效果。先看第一幅图,用户在偏好设置中选择了普通字体;在第二幅图中,用户则在偏好设置中选择了超大字体。请注意文本框功能在不同的设置下是如何控制显示效果的。
总结
Android设备林林总总,尺寸不同且形状各异,因此Android用户必然会根据自己设备型号的不同对应用程序中的字体提出有针对性的需求。由于屏幕尺寸的固有限制,开发人员必须在应用程序中采取适当的应对措施,才能保证文本内容在任何机型中都拥有理想的可读性与灵活的排版效果。第一步,确保自己的应用程序使用完全独立于设备之外的、以像素为基础单位的尺寸设置方案,但也不要忘了用户设置将给实际显示效果带来的巨大甚至是意料之外的影响。