参考 http://blog.csdn.net/sky181772733/article/details/7003125
在前一篇讲到ListView中TextView跑马灯效果的问题。一种比较友好的方式是,ListView中只有被选中项才会触发跑马灯效果。
实现的思路是:监听到ListView的onItemClick事件时记录当前item的postion,并通知adapter数据发生改变(另一个item被选中,selected状态改变),需要getView更新View(之前selected的item停止跑马灯效果,当前selected的item开始跑马灯效果)。 下面看看是具体怎么实现的,
public class MainActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final MyArrayAdapter adapter = new MyArrayAdapter(this, R.layout.list_item, R.id.textView1); adapter.add("超长的文本超长的文本超长的文本"); adapter.add("超长的文本超长的文本超长的文本"); adapter.add("超长的文本超长的文本超长的文本"); adapter.add("超长的文本超长的文本超长的文本"); adapter.add("超长的文本超长的文本超长的文本"); adapter.add("超长的文本超长的文本超长的文本"); getListView().setAdapter(adapter); getListView().setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 设置选中项 adapter.setSelectedIndex(position); // 通知adapter数据发生变化(TextView的selected状态发生变化) adapter.notifyDataSetChanged(); } }); } class MyArrayAdapter extends ArrayAdapter<String> { public MyArrayAdapter(Context context, int resource, int textViewResourceId) { super(context, resource, textViewResourceId); } private int mSelectedIndex; public void setSelectedIndex(int index) { this.mSelectedIndex = index; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = super.getView(position, convertView, parent); TextView tv = (TextView) v.findViewById(R.id.textView1); if (mSelectedIndex == position) { tv.setSelected(true); } else { tv.setSelected(false); } return v; } } }
运行效果如下,代码见附件
ZTE-N760
摄像头像素:320万像素,最大支持2048×1536像素照片拍摄
屏幕分辨率:3.5英寸,分辨率为480×320的电容式屏幕
像素和尺寸:每一厘米等于28像素;若分辨率不变,增加照片尺寸,就会出现马赛克;在COMS/CCD尺寸不变的情况下,像素越低,打印出来的照片越小,像素越高,打印出来的照片就越大。
1.调用自带照相机进行照相,然后返回,并保存到指定目录下,预览照片。结果如下:
2.程序代码
package com.photos;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;//供访问环境变量
import android.app.Activity;
import android.content.Intent;
import android.view.Display;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.Button;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
publicclass MainActivity extends Activity {
finalstaticintCAMERA_RESULT = 0;
Button mButton1;
ImageView mImageView1;
String imageFilePath;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton1 = (Button)findViewById(R.id.myButton1);
//点击照相按钮响应
mButton1.setOnClickListener(new Button.OnClickListener(){
@Override
publicvoid onClick(View arg0) {
// TODO Auto-generated method stub
// 获取系统的时间:年月日_时分秒作为文件名称
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
// 获取SD卡路径返回扩展存储区目录(SDCard)+子目录/DCIM/mytest+File.separator是一个分隔符"\" + 文件名称
imageFilePath = Environment.getExternalStorageDirectory()
.toString()+"/DCIM/mytest" + File.separator+”IMG_”+timeStamp +".jpg";
// 在指定路径下,新建文件用来存储照片信息
File imageFile = new File(imageFilePath);
//URI是统一资源标识符(Uniform Resource Identifier) 的意思,它的作用是根据这个URI找到某个资源文件
Uri imageFileUri = Uri.fromFile(imageFile);
//new一个Intent 调用照相机照相
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
//调用一个新的Activity
startActivityForResult(i, CAMERA_RESULT);
}
;
});
}
@Override
protectedvoid onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
//如果拍照成功
if (resultCode == RESULT_OK) {
//获取ImageView控件
mImageView1 = (ImageView) findViewById(R.id.myImageView1);
//取得屏幕的显示大小
Display currentDisplay = getWindowManager().getDefaultDisplay();
int dw = currentDisplay.getWidth();
int dh = currentDisplay.getHeight();
/**
* 为了计算缩放的比例,我们需要获取整个图片的尺寸,而不是图片
* BitmapFactory.Options类中有一个布尔型变量inJustDecodeBounds,将其设置为true
* 这样,我们获取到的就是图片的尺寸,而不用加载图片了。
* 当我们设置这个值的时候,我们接着就可以从BitmapFactory.Options的outWidth和outHeight中获取到值
*/
//对拍出的照片进行缩放
BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
//将其设置为true来获取图片尺寸了
bmpFactoryOptions.inJustDecodeBounds = true;
Bitmap bmp = BitmapFactory.decodeFile(imageFilePath,
bmpFactoryOptions);
int heightRatio = (int) Math.ceil(bmpFactoryOptions.outHeight
/ (float) dh); //计算高度比例
int widthRatio = (int) Math.ceil(bmpFactoryOptions.outWidth
/ (float) dw); //计算宽度比例
/**
* 接下来,我们就需要判断是否需要缩放以及到底对宽还是高进行缩放。
* 如果高和宽不是全都超出了屏幕,那么无需缩放。
* 如果高和宽都超出了屏幕大小,则如何选择缩放呢》
* 这需要判断wRatio和hRatio的大小
* 大的一个将被缩放,因为缩放大的时,小的应该自动进行同比率缩放。
* 缩放使用的还是inSampleSize变量
*/
if (heightRatio > 1 && widthRatio > 1) {
if (heightRatio > widthRatio) {
bmpFactoryOptions.inSampleSize = heightRatio;
} else {
bmpFactoryOptions.inSampleSize = widthRatio;
}
}
//注意这里,一定要设置为false,因为上面我们将其设置为true来获取图片尺寸了
bmpFactoryOptions.inJustDecodeBounds = false;
bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
mImageView1.setImageBitmap(bmp);
}
}
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
returntrue;
}
}
调用自带的摄像机:
Intent i = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
i.putExtra(android.provider.MediaStore.EXTRA_VIDEO_QUALITY, 1);//设置视频
不知道为什么,在调用摄像机的时候,加入我设置了路径,那么保存下来的录像文件竟然是空的,不懂?所以我设置了错误的路径,就是在SD卡上不存在的路径,那么保存下来的录像文件就保存在了默认文件夹下 DCIM/Camera/ 这时候文件是好的??不懂为什么?
//通过包名和类名启动activity
private void openCamera() {
Logger.d(TAG, "openCamera");
ComponentName component = new ComponentName("com.android.camera", "CameraLauncher");
Intent intent = new Intent();
intent.setComponent(component);
mActivity.startActivity(intent);
}
//通过action启动应用
private void openCamera() {
Intent intent = new Intent();
intent.setAction("android.media.action.STILL_IMAGE_CAMERA");
mActivity.startActivity(intent);
}