Android基础第十天

图像相关:

一个图片资源在内存中所占用的内存大小是怎么计算的?
按照像素的多少 乘以 每个像素所占用的内存

将一个图片资源转为Bitmap用到了一个什么工厂?(BitmapFactory)
以下三种是常见的将一些资源转为图片的方法
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
BitmapFactory.decodeStream()
BitmapFactory.decodeFile()

只获取图片的头信息不读取图片的信息,例如宽和高
Options outOpts = new Options();
outOpts.inJustDecodeBounds = true;
这次返回的bitmap为null
BitmapFactory.decodeFile("mnt/sdcard/big.jpg", outOpts);
int bitmapWidth = outOpts.outWidth;
int bitmapHeight = outOpts.outHeight;

那么直接用代码创建一个空白的Bitmap是怎么样的呢?(Bitmap…)
Bitmap.createBitmap() 创建一个空白的图片! 不过默认里面的颜色是黑的

直接加载大图片可能会发生什么错误?
OOM (OutOfMemory)内存溢出的错误
怎么压缩图片呢?用到一个options类,这个类的什么属性可以用来压缩图片?
Options opts = new Options();//创建一个选项条件
opts.inSampleSize
传进去的数值有什么特点??
必须是2的幂!!,
opts.inSampleSize = 4;// 2^0 =1 ,2^1 = 2 ,2^2 = 4,2^3 = 8,2^4 = 16

接下来就是图片缩放,平移,旋转,以及镜面和倒影效果
如果对图片进行处理,首先明确一个概念。。并不是直接在原图上进行修改!而是自己先
创建一个空白的图片!
然后对图片真正进行处理的时候 是用到了Matrix这样一个矩阵类,来对图片进行处理的!

matrix.setScale(2, 1); 水平方向缩放

matrix.setTranslate(100, 100);x,y轴分别平移100个像素

matrix.setRotate(180, srcBitmap.getWidth()/2, srcBitmap.getHeight()/2); 以中心点旋转180度

matrix.setScale(-1, 1); 镜面效果
matrix.setScale(1, -1); 倒影效果 

canvas.drawBitmap(srcBitmap, matrix, paint);
iv_dest.setImageBitmap(copyedBitmap);

画画脑海里始终想着至少三个东西(画板canvas,纸bitmap,笔paint)
paint可以设置笔的颜色,
paint.setColor(Color.BLACK);
bitmap可以直接设置某个像素的颜色(比如撕衣服中的改变某个像素为透明),
bitmap.setPixel
canvas用来控制想画什么东西!drawLine,drawBitmap,drawCircle等.
canvas.drawBitmap

getX 和 getRawX 区别?
getX是根据控件的坐标系来获取数据的
getRawX是屏幕的坐标系来获取数据的
prepared 和 preparedAsync 区别是什么?

音乐播放器的状态图复习一遍!理解什么时候可以哪些方法?
prepared是同步的,
preparedAsync异步的,就是内部会开启一个子线程
当我们要使用的音频文件非常短暂的时候,就去使用SoundPool效果更佳

比如播放一系列的 快速开枪 音频
//参数1,声音池存放的声音的数量,声音的类型,声音质量0即可
soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
//往声音池中存放声音
soundID = soundPool.load(this, R.raw.shoot, 1);
//播放某个声音
soundPool.play(soundID, 1.0f, 1.0f, 0, 0, 1.0f);
视频播放

播放视频是VideoVIew –> 它继承的是SurfaceView利用了它的功能,

vv = (VideoView) findViewById(R.id.vv);
vv.setVideoPath(“/mnt/sdcard/oppo.3gp”);

MediaController mc = new MediaController(this);
//设置控制器 控制的是那一个videoview
mc.setAnchorView(vv);
//设置videoview的控制器为mc
vv.setMediaController(mc);
vv.start();
复习下SurfaceView的内部刷新原理,采用和listview一样的设计思想,是什么?

MVC的设计思想,SurfaceView是 View,SurfaceHolder是Controller控制器
怎么监听surfaceview的生命周期方法?

//注册一个surfaceview控制器的回调
sv.getHolder().addCallback(new Callback() {

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    System.out.println("surface被销毁了");
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    System.out.println("surface创建了");       
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    System.out.println("surface大小发生了变化");
}

});
拍照

//开启手机的照相机应用拍照获取返回值
定义一个Intent
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//指定拍的照片存在哪里
file = new File(Environment.getExternalStorageDirectory(),SystemClock.uptimeMillis()+”.jpg”);
//设置刚才创建的file对象
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));

//开启照相机去拍照
startActivityForResult(intent, 0);

//收到照相机返回的结果,想拍照的图像显示出来
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(file!=null&&file.exists()&&file.length()>0){
        System.out.println(file.getAbsolutePath());
        ImageView iv = (ImageView) findViewById(R.id.iv);
        iv.setImageURI(Uri.fromFile(file));
    }
    super.onActivityResult(requestCode, resultCode, data);
}

录制视频

可以发现和上面的照相写法基本一致,不过只是action发生了变化,因为这次我们是要录制一个视频了
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
//还有就是存放的文件格式发生的了变化,是3gp这种视频格式
file = new File(Environment.getExternalStorageDirectory(),SystemClock.uptimeMillis()+”.3gp”);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));

startActivityForResult(intent, 0);

最后把录制的视频,用ViedeoView播放出来
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(file!=null&&file.exists()&&file.length()>0){
System.out.println(file.getAbsolutePath());
VideoView vv= (VideoView) findViewById(R.id.vv);
vv.setVideoPath(file.getAbsolutePath());
MediaController mc = new MediaController(this);
mc.setAnchorView(vv);
vv.setMediaController(mc);
vv.start();
}
super.onActivityResult(requestCode, resultCode, data);
}
传感器

//1,拿到传感器管理者对象
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
//2,通过管理者对象得到某一个传感器
Sensor sensor = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);
//3,设置一个监听器,监听传感器数据的变化
listener = new MyListnener();
sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_FASTEST);

private class MyListnener implements SensorEventListener{
//当传感器数据变化的调用的方法
@Override
public void onSensorChanged(SensorEvent event) {
//values里面的值是根据拿到的传感器对象的不同来决定的,这里因为上面拿到的是方向传感器,因此里面的值是对应的方向,如果是光传感器那么对应的就是光的强弱了
//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) {

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值