ColorMatrix的使用
Android系统中提供一个用于调整颜色的矩阵ColorMatrix
public class MainActivity extends Activity {
private SeekBar seekBar;
private ImageView iv;
private Canvas canvas;
private Paint paint;
private Bitmap bitmap,newBitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekBar = (SeekBar) findViewById(R.id.sb);
iv = (ImageView) findViewById(R.id.iv);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int result = (int) (seekBar.getProgress()/50.0f);
ColorMatrix cm = new ColorMatrix();
cm.set(new float[] {
1*result, 0, 0, 0, 0, //红
0, 1, 0, 0, 0, //绿
0, 0, 1, 0, 0, //蓝
0, 0, 0, 1, 0 //透明度
});
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(bitmap, new Matrix(), paint);
iv.setImageBitmap(newBitmap);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
});
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bb);
newBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
canvas = new Canvas(newBitmap);
paint = new Paint();
canvas.drawBitmap(bitmap, new Matrix(), paint);
iv.setImageBitmap(newBitmap);
}
}
SoundPool的使用场景及使用方式
使用场景
大量较短的音频文件需要播放时
public class MainActivity extends Activity {
private SoundPool sp;
private int soundId;
/**
* 新建一个raw文件夹,存放短音乐资源
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//参数分别为:声音池中声音的最大数量,声音类型,声音质量(暂时没效果)
// sp = new SoundPool(maxStreams, streamType, srcQuality)
sp = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
//参数分别为:上下文,音频资源id,优先级(暂时没效果)
soundId = sp.load(this, R.raw.shoot, 0);
}
public void shoot(View view){
/**
sp.play(soundID, leftVolume, rightVolume, priority, loop, rate)
* soundID a soundID returned by the load() function
leftVolume left volume value (range = 0.0 to 1.0)
rightVolume right volume value (range = 0.0 to 1.0)
priority stream priority (0 = lowest priority)
loop loop mode (0 = no loop, -1 = loop forever)
rate playback rate (1.0 = normal playback, range 0.5 to 2.0)*/
//参数分别为:音频id,左声道音量,右声道音量,优先级,循环模式(0不循环,-1一直循环),播放的速率
sp.play(soundId, 1.0f, 1.0f, 0, 0, 1.0f);
}
}
VideoView播放视频
public class MainActivity extends Activity {
private VideoView vv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vv = (VideoView) findViewById(R.id.vv);
vv.setVideoPath("/mnt/sdcard/oppo.3gp");
MediaController mc = new MediaController(this);
//设置控制器关联的视频是vv
mc.setAnchorView(vv);
//设置视频对应的控制器是mc
vv.setMediaController(mc);
vv.start();
}
}
SurfaceView的作用、实现机制、特点
- 作用:单位时间内完成界面的大量多次更新,一般用于游戏开发
- 实现机制:双缓冲机制
A线程—-更新ui —–后台计算—更新ui
B线程—-后台计算—-更新ui —后台计算 - 特点:可以在子线程中更新UI
使用SurfaceView播放视频
public class MainActivity extends Activity {
private SurfaceView sv;
private MediaPlayer mp;
private SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sv = (SurfaceView) findViewById(R.id.sv);
sp = getSharedPreferences("config", 0);
sv.getHolder().addCallback(new Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mp = new MediaPlayer();
mp.setDataSource("/mnt/sdcard/oppo.3gp");
mp.prepare();
mp.setDisplay(holder);
mp.start();
int postion = sp.getInt("postion", 0);
mp.seekTo(postion);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mp != null) {
int position = mp.getCurrentPosition();
Editor edit = sp.edit();
edit.putInt("postion", position);
edit.commit();
mp.stop();
mp.release();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
});
}
}
调用系统相机拍照
public class MainActivity extends Activity {
private ImageView iv;
private File file;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
}
//点击拍照按钮
public void click(View view) {
// D:\eclipseHeima\adt-bundle-windows-x86_64_20140101\sdk\docs\guide\topics\media\camera.html
// create Intent to take a picture and return control to the calling
// application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
file = new File(Environment.getExternalStorageDirectory(),
"aa.jpg"); // create a file to save
// the image
System.out.println("file:"+file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, file); // set the image file name
// start the image capture Intent
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
System.out.println("onActivityResult");
if (file != null && file.exists() && file.length() > 0) {
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
System.out.println(file.getAbsolutePath());
iv.setImageBitmap(bitmap);
// iv.setImageURI(Uri.fromFile(file));
}
super.onActivityResult(requestCode, resultCode, data);
}
}
调用系统相机录视频
public class MainActivity extends Activity {
private VideoView vv;
private File file ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vv = (VideoView) findViewById(R.id.vv);
}
public void click(View view){
//D:\eclipseHeima\adt-bundle-windows-x86_64_20140101\sdk\docs\guide\topics\media\camera.html
// create Intent to take a picture and return control to the calling application
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
file = new File(Environment.getExternalStorageDirectory(),SystemClock.uptimeMillis()+".3gp"); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, file); // set the image file name
// start the image capture Intent
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (file != null && file.exists() && file.length()>0) {
vv.setVideoPath(file.getAbsolutePath());
MediaController mc = new MediaController(this);
mc.setAnchorView(vv);
vv.setMediaController(mc);
vv.start();
}
super.onActivityResult(requestCode, resultCode, data);
}
}
传感器的使用
- 传感器(英文名称:sensor)是一种检测装置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出
- 陀螺仪又叫角速度传感器,是不同于加速度计(G-sensor)的,他的测量物理量是偏转、倾斜时的转动角速度。在手机上,仅用加速度计没办法测量或重构出完整的3D动作,测不到转动的动作的,G-sensor只能检测轴向的线性动作。但陀螺仪则可以对转动、偏转的动作做很好的测量,这样就可以精确分析判断出使用者的实际动作。而后根据动作,可以对手机做相应的操作
光传感器:
public class MainActivity extends Activity {
private SensorManager sm;
private MyListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* sm = (SensorManager) getSystemService(SENSOR_SERVICE);
//得到光传感器
List<Sensor> list = sm.getSensorList(Sensor.TYPE_ALL);
//得到系统的所有传感器
for (Sensor sensor : list) {
System.out.println(sensor);
}
#define SENSOR_TYPE_ACCELEROMETER 1 //加速度
#define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力
#define SENSOR_TYPE_ORIENTATION 3 //方向
#define SENSOR_TYPE_GYROSCOPE 4 //陀螺仪
#define SENSOR_TYPE_LIGHT 5 //光线感应
#define SENSOR_TYPE_PRESSURE 6 //压力
#define SENSOR_TYPE_TEMPERATURE 7 //温度
#define SENSOR_TYPE_PROXIMITY 8 //接近
#define SENSOR_TYPE_GRAVITY 9 //重力
#define SENSOR_TYPE_LINEAR_ACCELERATION 10//线性加速度
*/
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
//得到光传感器
Sensor sensor = sm.getDefaultSensor(Sensor.TYPE_LIGHT);
listener = new MyListener();
sm.registerListener(listener, sensor, sm.SENSOR_DELAY_NORMAL);
}
class MyListener implements SensorEventListener{
@Override
//传感器数据发生变化的时候调用的方法
public void onSensorChanged(SensorEvent event) {
float values = event.values[0];
System.out.println("光线强度为"+values);
}
@Override
//传感器精度发生变化时调用的方法
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
}
@Override
protected void onDestroy() {
sm.unregisterListener(listener);
super.onDestroy();
}
}
方向感器:
public class MainActivity extends Activity {
private SensorManager sm;
private MyListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
//得到方向感器
Sensor sensor = sm.getDefaultSensor(3);
listener = new MyListener();
sm.registerListener(listener, sensor, sm.SENSOR_DELAY_NORMAL);
}
class MyListener implements SensorEventListener{
@Override
//传感器数据发生变化的时候调用的方法
public void onSensorChanged(SensorEvent event) {
//values[0]: 地磁北极和手机y轴的夹角, 0=北, 90=东, 180=南, 270=西
int angle = (int) event.values[0];
if(angle>0&&angle<90){
System.out.println("东北");
}else if (angle>90&&angle<180){
System.out.println("东南");
}else if(angle>180&&angle<270){
System.out.println("西南");
}else if(angle>270&&angle<360){
System.out.println("西北");
}else if(angle==0){
System.out.println("北");
}else if(angle==90){
System.out.println("东");
}else if(angle==180){
System.out.println("南");
}else if(angle==270){
System.out.println("西");
}
}
@Override
//传感器精度发生变化时调用的方法
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
}
@Override
protected void onDestroy() {
sm.unregisterListener(listener);
super.onDestroy();
}
}