Android12
来源:互联网 发布:淘宝上哪个宠物店可信 编辑:程序博客网 时间:2024/06/05 05:31
Android12
计算机图形的表示方法
位图
一个一个像素点
算法:
位图图形的大小=位图的宽度 * 位图的高度 * 每一个像素点占据字节数
位图的宽度 * 位图的高度 是分辨率
BMP的格式:
单色位图 1个bit byte = 1/8
16色位图 4个bit byte = 4/8
256色位图 8个bit byte = 8/8
24位位图 24个bit byte = 24/8
矢量图
根据比例
加载图片到内存
public void loadImage(View view){ //加载一个图片到内存 显示到imageview的控件上. Bitmap bitmap = BitmapFactory.decodeFile("mnt/sdcard/big.jpg"); //32位的位图, argb iv.setImageBitmap(bitmap);}--------------------------------------BitmapFactory.decodeStream(is);(最多用)BitmapFactory.decodeFile("mnt/sdcard/big.jpg");(次多用(getFiles(),getcache(),SDcard中范围))BitmapFactory.decodeResource(res, id);(相对少)
Android下面的位图默认是32位
ARGB : alpha red green blue 每一个是8位
图片需要加载内存的大小(1.6M在硬盘) = 宽度 * 高度 * (32/8)(内存中15.4M)
加载大图片到内存
//加载一个图片到内存 显示到imageview的控件上.Options opts = new Options();//创建一个选项条件opts.inSampleSize = 4;//设置采样率,宽高分别是原图的1/4,总像素个数就变成原图的1/16Bitmap bitmap = BitmapFactory.decodeFile("mnt/sdcard/big.jpg", opts);//32位的位图, argb iv.setImageBitmap(bitmap);
//1.得到图片的宽高信息.ExifInterface exif = new ExifInterface("mnt/sdcard/big.jpg");int width = exif.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, 0);int height = exif.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, 0);System.out.println("widtH:"+width);System.out.println("height:"+height);//2.获取屏幕的宽高WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);int screenWidth = wm.getDefaultDisplay().getWidth();int screenHeight = wm.getDefaultDisplay().getHeight();System.out.println("屏幕width:"+screenWidth);System.out.println("屏幕height:"+screenHeight);
图片的缩放
public void processImage(View view){ //得到原始位图的对象 Bitmap srcBitmap = BitmapFactory.decodeFile("/mnt/sdcard/tu1.jpg"); iv_src.setImageBitmap(srcBitmap); //缩放后 显示一个缩放后的图片 在iv_dest //用代码编辑图片,最好处理都是图片在内存中的拷贝,不去处理原图. Bitmap copyedBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig()); //临摹.创建一个画板 Canvas canvas = new Canvas(copyedBitmap); //创建画笔 Paint paint = new Paint(); paint.setColor(Color.BLACK); //作画 Matrix matrix = new Matrix();//按照1:1的比例作画 matrix.setScale(0.6f, 0.6f); canvas.drawBitmap(srcBitmap, matrix, paint); iv_dest.setImageBitmap(copyedBitmap);}
图片的平移旋转镜面和倒影效果
//平移Bitmap copyedBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());//临摹.创建一个画板Canvas canvas = new Canvas(copyedBitmap);//创建画笔Paint paint = new Paint();paint.setColor(Color.BLACK);//作画Matrix matrix = new Matrix();//按照1:1的比例作画matrix.setTranslate(100, 100);canvas.drawBitmap(srcBitmap, matrix, paint);iv_dest.setImageBitmap(copyedBitmap);
//旋转Bitmap copyedBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());//临摹.创建一个画板Canvas canvas = new Canvas(copyedBitmap);//创建画笔Paint paint = new Paint();paint.setColor(Color.BLACK);//作画Matrix matrix = new Matrix();//按照1:1的比例作画matrix.setRotate(180, srcBitmap.getWidth()/2, srcBitmap.getHeight()/2);canvas.drawBitmap(srcBitmap, matrix, paint);iv_dest.setImageBitmap(copyedBitmap);
//镜面Canvas canvas = new Canvas(copyedBitmap);//创建画笔Paint paint = new Paint();paint.setColor(Color.BLACK);//作画Matrix matrix = new Matrix();//按照1:1的比例作画matrix.setScale(-1, 1);matrix.postTranslate(srcBitmap.getWidth(), 0);canvas.drawBitmap(srcBitmap, matrix, paint);iv_dest.setImageBitmap(copyedBitmap);
//倒影Bitmap copyedBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());//临摹.创建一个画板Canvas canvas = new Canvas(copyedBitmap);//创建画笔Paint paint = new Paint();paint.setColor(Color.BLACK);//作画Matrix matrix = new Matrix();//按照1:1的比例作画matrix.setScale(1, -1);matrix.postTranslate(0, srcBitmap.getHeight());canvas.drawBitmap(srcBitmap, matrix, paint);iv_dest.setImageBitmap(copyedBitmap);
随手涂鸦的ui
view水平方向线性布局
拖动条SeekBar
ImageView
// 设置画笔的颜色paint.setColor(Color.BLACK);// 设置画笔的宽度paint.setStrokeWidth(5);
随手涂鸦的核心逻辑
触摸事件的操作:
iv.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN:// 按下 case MotionEvent.ACTION_MOVE:// 移动 case MotionEvent.ACTION_UP:// 离开 return true; //false代表的是事件没有处理完毕,等待事件处理完毕, true代表事件已经处理完毕了. }}
System.out.println("摸到");startX = (int) event.getX();startY = (int) event.getY();System.out.println("移动");int newX = (int) event.getX();int newY = (int) event.getY();//画直线canvas.drawLine(startX, startY, newX, newY, paint);iv.setImageBitmap(alterBitmap);// 记得重新初始化手指在屏幕上的坐标startX = (int) event.getX();startY = (int) event.getY();
随手涂鸦的细节
File file = new File(Environment.getExternalStorageDirectory(), SystemClock.currentThreadTimeMillis() + ".jpg");FileOutputStream stream = new FileOutputStream(file);------------------------------------------ //保存图片的API,格式,质量,输出流sdcard位置alterBitmap.compress(CompressFormat.JPEG, 100, stream);//欺骗系统,插入SDcard的广播Intent intent = new Intent();intent.setAction(Intent.ACTION_MEDIA_MOUNTED);intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));sendBroadcast(intent);<!-- 写入SDcard的权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
撕衣服
public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: x = (int) event.getX(); y = (int) event.getY(); for(int i=-3;i<4;i++){ for(int j=-3;j<4;j++){ if(Math.sqrt(i*i+j*j)<=3){ try { alterBitmap.setPixel(x+i, y+j, Color.TRANSPARENT); } catch (Exception e) { e.printStackTrace(); } } } } iv_pre.setImageBitmap(alterBitmap); break; case MotionEvent.ACTION_MOVE: x = (int) event.getX(); y = (int) event.getY(); for(int i=-3;i<4;i++){ for(int j=-3;j<4;j++){ if(Math.sqrt(i*i+j*j)<=3){ try { alterBitmap.setPixel(x+i, y+j, Color.TRANSPARENT); } catch (Exception e) { e.printStackTrace(); } } } } iv_pre.setImageBitmap(alterBitmap); break; case MotionEvent.ACTION_UP: break; } return true;// 事件结束被消费掉了 }});
getX和getRawX区别
getX到控件的距离
getRawX到屏幕的距离
图片的颜色处理
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sb_red = (SeekBar) findViewById(R.id.sb_red); iv = (ImageView) findViewById(R.id.iv); sb_red.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { int progress = seekBar.getProgress(); float result = progress/50.0f; System.out.println("变化的百分比为:"+result); 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(srcBitmap, new Matrix(), paint); iv.setImageBitmap(copyedBitmap); } });
音乐播放器的状态图
mediaPlayer = new MediaPlayer();final ProgressDialog pd = new ProgressDialog(this);pd.setMessage("正在缓冲...");mediaPlayer.reset();//设置播放的文件mediaPlayer.setDataSource(et_path.getText().toString().trim());mediaPlayer.prepare();//同步的准备pd.show();mediaPlayer.setOnErrorListener(new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Toast.makeText(MainActivity.this, "播放失败,错误代码:"+what, 0).show(); return false; }});public void pause(View view) { if(mediaPlayer!=null&&mediaPlayer.isPlaying()){ mediaPlayer.pause(); return; } if(mediaPlayer!=null){ mediaPlayer.start(); }}public void stop(View view) { if(mediaPlayer!=null){ mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; }}
异步播放网络上的音乐文件
mediaPlayer.prepareAsync();//异步的准备,开启子线程去准备mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { pd.dismiss(); mediaPlayer.start(); }});
soundpool
打篮球的声音是用soundpool做的,不是mediaPlayer
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0); soundID = soundPool.load(this, R.raw.shoot, 1);}public void click(View view){ soundPool.play(soundID, 1.0f, 1.0f, 0, 0, 1.0f);}
视频播放器
protected void onCreate(Bundle savedInstanceState) { VideoView vv 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子线程更新ui
/** * 演示SurfaceView控件的使用 * SurfaceView 单位时间内完成界面的大量多次更新 * 双缓冲机制 : * A线程----更新ui -----后台计算---更新ui * B线程----后台计算----更新ui ---后台计算 * 可以在子线程更新ui */
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="click" android:text="开启子线程更新ui" /><SurfaceView android:id="@+id/sv" android:layout_width="match_parent" android:layout_height="match_parent" />
surfaceview生命周期的回调
sv = (SurfaceView) findViewById(R.id.sv);//注册一个surfaceview控制器的回调sv.getHolder().addCallback(new Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { System.out.println("surface被销毁了"); flag = false; } @Override public void surfaceCreated(SurfaceHolder holder) { System.out.println("surface创建了"); flag = true; new Thread(){ public void run() { for(int i = 0;i<100;i++){ if(!flag){ return ; } //界面里面内容显示的控制器 SurfaceHolder holder = sv.getHolder(); Canvas canvas = holder.lockCanvas(); canvas.drawColor(Color.BLACK); int radius = 5+i; Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawCircle(250, 250, radius, paint); holder.unlockCanvasAndPost(canvas); SystemClock.sleep(100); } }; }.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { System.out.println("surface大小发生了变化"); }});
采用surfaceview播放视频
<SurfaceView android:id="@+id/sv" android:layout_width="match_parent" android:layout_height="match_parent" />
@Overridepublic void surfaceCreated(SurfaceHolder holder) { System.out.println("surface被创建"); try { mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource("/mnt/sdcard/oppo.3gp"); mediaPlayer.prepare(); } catch (Exception e) { e.printStackTrace(); } //指定多媒体的内容实在holder里面显示 mediaPlayer.setDisplay(holder); mediaPlayer.start(); mediaPlayer.seekTo(sp.getInt("position", 0));}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) { System.out.println("surface被销毁"); if(mediaPlayer!=null){ int position = mediaPlayer.getCurrentPosition(); Editor editor = sp.edit(); editor.putInt("position", position); editor.commit(); mediaPlayer.stop(); mediaPlayer.release(); }}
照相机拍照
public void takePic(View view){ //开启手机的照相机应用拍照获取返回值 // 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(),SystemClock.uptimeMillis()+".jpg"); // create a file to save the image intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); // set the image file name // start the image capture Intent startActivityForResult(intent, 0);}@Overrideprotected 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);}
视频的录制
public void takePic(View view){ //开启手机的照相机应用拍照获取返回值 // 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, Uri.fromFile(file)); // set the image file name // start the image capture Intent startActivityForResult(intent, 0);}@Overrideprotected 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);}
传感器的使用
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sm = (SensorManager) getSystemService(SENSOR_SERVICE); //得到光传感器 Sensor sensor = sm.getDefaultSensor(Sensor.TYPE_LIGHT); listener = new MyListnener(); sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL);}private class MyListnener implements SensorEventListener{ //当传感器数据变化的调用的方法 @Override public void onSensorChanged(SensorEvent event) { float light = event.values[0]; System.out.println("光线强度:"+light); } //当传感器精度发生变化的时候调用的方法 @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { }}@Overrideprotected void onDestroy() { sm.unregisterListener(listener); listener = null; super.onDestroy();}
指南针
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 MyListnener(); sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL);}private class MyListnener 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) { }}@Overrideprotected void onDestroy() { sm.unregisterListener(listener); listener = null; super.onDestroy();}
0 0
- Android12
- Android12
- android12——NotificationManager
- Android12个重要知识点(01)
- Android12个重要知识点(2)
- Android 横竖屏随意切换的两种方式
- 蓝牙4.0BLE在安卓项目中的使用详解
- Android11
- user版本如何打开uart,让android log从串口kernel log输出
- 在运行时调用动态链接库 VS2010示例
- Android12
- Android中finish()与destroy()的区别
- 新人掌握的五大Linux终端命令的技巧
- 六、Intellij IDEA 2016.3使用简记
- android微信支付测试遇到的坑,得不到prepay_id
- Leetcode 205 Isomorphic Strings
- 前端漂亮分页代码
- wget的安装方法
- 一些网站