本帖最后由 allen927 于 2015-12-12 16:00 编辑
同样的课程、老师、就业,更好的学习环境,更低的学习成本! android基础Day09(多媒体)
•(了解)计算机图形表示原理图片:宽 高 图片是由每个像素点来组成 像素点:小方块 图片的大小:宽*高*每个像素点的大小
•(掌握)从SdCard加载图片显示
•(了解)加载大图片OOM异常
内存溢出 本身的大小:2.65MB dalvik vm:默认16M 解决的思路:
•(掌握)缩放加载大图片
•(了解)图形处理的原理对图片进行一些简单的处理: 进行旋转 进行平移 缩放 绘图的操作: android里面所有的显示效果都是绘制出来的。
绘制图片: 操作对象才可以: 有绘图的类 Canvas :画布 画板 纸 Paint :画笔 设置颜色 bitmap:要绘制的图形 paint:笔 matrix: Matrix 把图片绘制成什么效果。 矩阵 大学:线性代数 矩阵的运算 android设计了Matrix这个类 该类里面就封装了一些方法可以对图片进行处理。 3x3的矩阵
•(掌握)图形的旋转
ScrollView只能有一个子节点
public class MainActivity extends Activity{
privateImageView iv_old; privateImageView iv_new; privateBitmap bitmap;
@Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
iv_old= (ImageView) findViewById(R.id.iv_old); iv_new= (ImageView) findViewById(R.id.iv_new);
//原图 bitmap= BitmapFactory.decodeFile("/sdcard/mm.jpg"); iv_old.setImageBitmap(bitmap);
}
publicvoid load(View v){ //创建空白的图片 要和原图的大小一样 Bitmap bit = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), bitmap.getConfig());
//把图片进行旋转处理 Canvascanvas = new Canvas(bit);//画布 传递的参数必须是一个空白的图片 Paintpaint = new Paint();//画笔 Matrix matrix = new Matrix();//矩阵 //旋转30度 以图片的中心为圆心 matrix.setRotate(30, bitmap.getWidth()/2,bitmap.getHeight()/2); canvas.drawColor(Color.WHITE);//绘制背景为白色 canvas.drawBitmap(bitmap, matrix, paint);//绘制图片
//显示 iv_new.setImageBitmap(bit); }
}
•(掌握)图片的平移和缩放平移
缩放
•(掌握)图片画画涂鸦操作 public class MainActivity extends Activity{
publicstatic final String TAG = "MainActivity";
privateImageView iv;
privateBitmap bitmap;
privateBitmap bit;
privateCanvas canvas;
privatePaint paint; @Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
iv= (ImageView) findViewById(R.id.iv); //获取原图 bitmap= BitmapFactory.decodeFile("/sdcard/mm.jpg");
/** * 1 创建空白的图片 * 2 构建Canvas * 3 构建画笔 * 4 画图片 * 5 画线 * 6 显示图片 */ //1 创建空白的图片 bit = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), bitmap.getConfig()); //2 构建Canvas canvas = new Canvas(bit); //3 构建画笔 paint = new Paint(); paint.setColor(Color.GREEN);//设置画笔的颜色 绿色 //4 画图片 canvas.drawBitmap(bitmap, new Matrix(), paint); //5 画线 // canvas.drawLine(0, 0, 100, 100, paint); //6 显示图片 iv.setImageBitmap(bit);
//给图片设置触摸的监听 iv.setOnTouchListener(new MyOnTouchListener());
}
//触摸的监听器 privateclass MyOnTouchListener implements OnTouchListener{
//记录按下的点 privatefloat startX,startY;
@Override publicboolean onTouch(View v, MotionEventevent) { switch(event.getAction()) {//判断事件的动作 case MotionEvent.ACTION_DOWN://按下 Log.i(TAG,"按下"); //获取按下点的坐标 startX = event.getX(); startY = event.getY(); break; caseMotionEvent.ACTION_MOVE://移动 Log.i(TAG,"移动"); //获取移动的点 float stopX = event.getX(); float stopY = event.getY(); //画线 canvas.drawLine(startX, startY, stopX,stopY, paint); //显示图片 iv.setImageBitmap(bit);
//把移动的点置为开始点 startX = stopX; startY = stopY;
break; caseMotionEvent.ACTION_UP://弹起 Log.i(TAG,"弹起"); break;
default: break; } return true;//自己处理触摸事件 }
}
publicvoid save(View v){ //保存一张图片到sdcard 操作sdcard try{ File file = new File(Environment.getExternalStorageDirectory(),"temp.jpg"); OutputStream stream = newFileOutputStream(file); bit.compress(CompressFormat.JPEG, 100, stream);
//希望图片保存后 在android系统的自带的Gallery应用里面可以看到 /** * 原理:MediaProvider应用里面有一个广播接收者 该接收者 接收到广播 就可以扫描sdcard * 相册里面的数据是查询了MediaProvider应用 * 操作:发广播给相册应用里面的广播接收者 * <receiver android:name="MediaScannerReceiver"> <intent-filter> <actionandroid:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> <intent-filter> <actionandroid:name="android.intent.action.MEDIA_MOUNTED" /> <dataandroid:scheme="file" /> </intent-filter> <intent-filter> <actionandroid:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE" /> <dataandroid:scheme="file" /> </intent-filter> </receiver> * */ //发送广播 Intent intent = new Intent(); intent.setAction("android.intent.action.MEDIA_MOUNTED"); File dir =Environment.getExternalStorageDirectory(); intent.setData(Uri.fromFile(dir)); sendBroadcast(intent); }catch (Exception e) { e.printStackTrace(); } }
}
•(掌握)图片颜色处理-Android版本美图秀秀图片是有颜色: #f00 #ff0000 #ffff0000 argb :三基色 alpha red green blue
颜色的范围:0-256 最大值:256
核心原理:重绘图片 改变图片的颜色就是对画笔进行操作
图片的颜色:矩阵ColorMatrix 5x4的矩阵 4行 5列 public class MainActivity extends Activity{
privateImageView iv; privateBitmap bit; privateCanvas canvas; privatePaint paint; privateBitmap bitmap;
@Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv= (ImageView) findViewById(R.id.iv); SeekBarsb_red = (SeekBar) findViewById(R.id.sb_red); SeekBarsb_green = (SeekBar) findViewById(R.id.sb_green); SeekBarsb_blue = (SeekBar) findViewById(R.id.sb_blue); SeekBarsb_alpha = (SeekBar) findViewById(R.id.sb_alpha);
bitmap= BitmapFactory.decodeFile("/sdcard/mm.jpg"); iv.setImageBitmap(bitmap);
//给拖动条设置最大值 sb_red.setMax(256); sb_green.setMax(256); sb_blue.setMax(256); sb_alpha.setMax(256);
//设置滑动改变监听 MyOnSeekBarChangeListenerl = new MyOnSeekBarChangeListener(); sb_red.setOnSeekBarChangeListener(l); sb_green.setOnSeekBarChangeListener(l); sb_blue.setOnSeekBarChangeListener(l); sb_alpha.setOnSeekBarChangeListener(l);
bit= Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),bitmap.getConfig()); canvas= new Canvas(bit); paint= new Paint();
}
privateclass MyOnSeekBarChangeListener implements OnSeekBarChangeListener{
privatefloat r=1,g=1,b=1,a=1;
//在拖动的过程中一直调用 @Override publicvoid onProgressChanged(SeekBar seekBar, int progress, booleanfromUser) { switch(seekBar.getId()) { caseR.id.sb_red: r= (256 - progress)/(float)256; break; caseR.id.sb_green: g= (256 - progress)/(float)256; break; caseR.id.sb_blue: b= (256 - progress)/(float)256; break; caseR.id.sb_alpha: //透明 当用户拖动到最大 图片完全看不见 0 progress 256 范围:0 - 1 a= (256 - progress)/(float)256; break;
default: break; } ColorMatrix matrix = new ColorMatrix();//颜色矩阵 matrix.set(new float[]{ r,0,0,0,0,//red 0,g,0,0,0,//green 0,0,b,0,0,//blue 0,0,0,a,0 //alpha 0-1 要把256换算为1 }); ColorMatrixColorFilter filter = newColorMatrixColorFilter(matrix); paint.setColorFilter(filter); canvas.drawBitmap(bitmap, new Matrix(), paint); iv.setImageBitmap(bit); }
//开始拖动 @Override publicvoid onStartTrackingTouch(SeekBar seekBar) {
}
//停止 @Override publicvoid onStopTrackingTouch(SeekBar seekBar) {
}
}
}
需要在4.0的模拟器上进行演示
•(掌握)音乐播放器APIMediaPlayer
•(了解)音乐播放器方法调用时序图
•(掌握)视频播放器MediaPlayer本身能力是不足的。mp4 3gp avi:执行视频的转码 如果现在你有真机测试 发现可以播放avi ,手机定制商 已经对MediaPlayer类进行修改 。 测试要在4.0的模拟器
public class MainActivity extends Activity{
privateEditText et_path; privateMediaPlayer mp; privateSurfaceView surfaceView;
@Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
surfaceView= (SurfaceView) findViewById(R.id.surfaceview); //亮屏 surfaceView.setKeepScreenOn(true);
SurfaceHolder holder = surfaceView.getHolder(); //让SurfaceView把获取的信息直接输出 holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
et_path= (EditText) findViewById(R.id.et_path); mp= new MediaPlayer(); mp.reset();//重置 }
publicvoid play(View v){ Stringpath = et_path.getText().toString().trim(); if(TextUtils.isEmpty(path)){ Toast.makeText(this,"歌曲名称为空",0).show(); }else{ try{ mp.reset(); mp.setDataSource(path);//设置要播放的资源 mp.setDisplay(surfaceView.getHolder());//设置显示 mp.prepareAsync();//异步准备 //设置准备完成的监听 mp.setOnPreparedListener(newMediaPlayer.OnPreparedListener() {
@Override publicvoid onPrepared(MediaPlayer mp) { mp.start(); } }); }catch (Exception e) { //TODO Auto-generated catch block e.printStackTrace(); } } }
publicvoid pause(View v){ Buttonbt = (Button) v; if(mp.isPlaying()){ //点击暂停 bt.setText("继续"); mp.pause();//暂停 }else{ //点击继续 bt.setText("暂停"); mp.start();//继续播放 } }
publicvoid stop(View v){ mp.stop();//停止 }
publicvoid replay(View v){ //重播 try{ mp.stop(); mp.setDisplay(surfaceView.getHolder());//设置显示 mp.prepare();//准备 mp.seekTo(0);//跳转到开始位置开始播放 mp.start();//播放 }catch (Exception e) { //TODO Auto-generated catch block e.printStackTrace(); } }
@Override protectedvoid onDestroy() { super.onDestroy(); mp.stop(); mp.release();//释放资源 mp= null; }
}
•(掌握)surfaceviewSurfaceView:他是一个控件 作用:用来显示动态的画面 mp4 相机 游戏
•(掌握)surfaceview的生命周期在Activity完全显示之后才创建,当activity暂停后,该控件就会被销毁。
•(掌握)照相机
public class MainActivity extends Activity{
private Camera camera;
@Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SurfaceViewsurfaceView = (SurfaceView) findViewById(R.id.surfaceview); surfaceView.setKeepScreenOn(true); SurfaceHolderholder = surfaceView.getHolder(); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //添加监听 holder.addCallback(newCallback() {
@Override publicvoid surfaceDestroyed(SurfaceHolder holder) { camera.release();//释放资源 camera = null; }
@Override publicvoid surfaceCreated(SurfaceHolder holder) { try{ //打开相机 camera = Camera.open();//默认打开的是后置摄像头 camera.setPreviewDisplay(holder);//设置预览显示 camera.startPreview();//开始预览 }catch (Exception e) { //TODO Auto-generated catch block e.printStackTrace(); } }
@Override publicvoid surfaceChanged(SurfaceHolder holder, int format, int width, intheight) {
} }); }
publicvoid focus(View v){ //自动对焦 camera.autoFocus(null);//对焦功能都是由硬件来完成 } publicvoid takepicture(View v){ //拍照 //shutter快门 raw 相机捕获的原始数据 jpeg 相机处理后的数据 都是接口 camera.takePicture(null, null, new Camera.PictureCallback() {
@Override publicvoid onPictureTaken(byte[] data, Camera camera) { try{ //把数据保存 sdcard sdcard写权限 Filefile = newFile(Environment.getExternalStorageDirectory(),"wuhan06.jpg"); FileOutputStreamfos = new FileOutputStream(file); fos.write(data); fos.close(); //相机在拍照后 需要处理图片 后 相机就被占用了 //重新又画面 camera.startPreview();
}catch (Exception e) { //TODO Auto-generated catch block e.printStackTrace(); } } }); } }
•(掌握)录音机|录像机
public class MainActivity extends Activity{
privateMediaRecorder recorder; privateSurfaceView surfaceView;
@Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
surfaceView= (SurfaceView) findViewById(R.id.surfaceview); surfaceView.setKeepScreenOn(true); surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); }
publicvoid start(View v) { try{ //媒体刻录器 recorder= new MediaRecorder(); //设置音频的来源 麦克风 recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//设置视频的来源 相机 //文件输出的格式 3gp recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //设置音频的编码格式 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //设置视频的编码格式 recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); Filefile = newFile(Environment.getExternalStorageDirectory(),"shiping.3gp"); //指定文件输出的路径 recorder.setOutputFile(file.getAbsolutePath()); //设置预览显示 recorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); recorder.prepare();//准备 recorder.start();// 开始刻录 }catch (Exception e) { //TODO Auto-generated catch block e.printStackTrace(); } }
publicvoid stop(View v) { recorder.stop();//停止 recorder.reset();//重置 recorder.release();//释放 recorder = null; } }
•(掌握)传感器传感器:他是一种硬件设备 声音 光 重力 距离 温度 速度 。。。 android系统在设计api的时候,就已经对传感器进行了支持。 传感器类型:方向、加速度(重力)、光线、磁场、距离(临近性)、温度等。 方向传感器: Sensor.TYPE_ORIENTATION 加速度(重力)传感器: Sensor.TYPE_ACCELEROMETER 光线传感器: Sensor.TYPE_LIGHT 磁场传感器: Sensor.TYPE_MAGNETIC_FIELD 距离(临近性)传感器: Sensor.TYPE_PROXIMITY 温度传感器: Sensor.TYPE_TEMPERATURE 开发的应用: 1.手机可以根据光的强弱来自动调节屏幕的亮度 2.当手机在接听电话的时候,靠近耳朵屏幕变暗 3.公交车防盗
增加手机的特色 集成了很多硬件
生物智能 。。。
•(掌握)传感器案例-距离传感器android设计了api 传感器:Sensor 传感器管理器:SensorManager TelephonyManager 是一个系统服务 public class MainActivity extends Activity{
publicstatic final String TAG = "MainActivity"; privateSensorManager sensorManager; privateSensor sensor; privateMySensorEventListener listener;
@Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.tv).setKeepScreenOn(true);
//传感器管理器 sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); //距离传感器 sensor= sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); }
@Override protected void onResume() { super.onResume(); listener = new MySensorEventListener(); //监听 SensorManager.SENSOR_DELAY_GAME 事件的传输速率 sensorManager.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_GAME); } @Override protected void onPause() { super.onPause(); //取消监听 sensorManager.unregisterListener(listener); }
privateclass MySensorEventListener implements SensorEventListener{
//sensor值的改变 @Override publicvoid onSensorChanged(SensorEvent event) { float[] values = event.values; floatdistance = values[0]; Log.i(TAG,"distance:"+distance+"厘米"); }
//精确度的改变 @Override publicvoid onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
}
作业
现在按钮变为 正在下载 下载完成。 知识点: 1 刷新界面 :adapter.notifyDataSetChange(); 2 刷新就会自动调用getView()方法 3 记录条目的位置
下载资源
|