Android基础之ColorMatrix、SoundPool、VideoView、VideoView、传感器等

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();
        }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值