`

ch019 Android surfaceView

阅读更多

--------------------------------------------AndroidManifest.xml----------------------------------

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.ch19"

    android:versionCode="1"

    android:versionName="1.0" >

 

    <uses-sdk

        android:minSdkVersion="10"

        android:targetSdkVersion="15" />

 

    <application

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name=".MainActivity"

            android:label="@string/title_activity_main" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

 

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

 

</manifest>

--------------------------------------------activity_main.xml-------------------------------------

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/LinearLayout1"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:weightSum="1"

    android:orientation="vertical" >

 

    <SurfaceView

        android:id="@+id/surfaceVIew"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:layout_weight="0.15"

        tools:context=".MainActivity" />

    <LinearLayout 

        android:orientation="horizontal"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:layout_weight="0.85">

        <Button 

            android:id="@+id/btn1"

            android:text="开唱"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"/>

        <Button 

           android:id="@+id/btn2"

            android:text="暂停"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"/>

        <Button 

          android:id="@+id/btn3"

            android:text="停止"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"/>

        <Button 

           android:id="@+id/btn4"

            android:text="调低音量"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"/>

        <Button 

           android:id="@+id/btn5"

            android:text="调高音量"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"/>

    </LinearLayout>

 

</LinearLayout>

--------------------------------------------MainActivity.java--------------------------------------

package com.ch19;

 

import java.io.File;

import java.io.IOException;

import android.app.Activity;

import android.media.AudioManager;

import android.media.MediaPlayer;

import android.os.Bundle;

import android.os.Environment;

import android.util.Log;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.Window;

import android.view.WindowManager;

import android.widget.Button;

 

/**

 * 

 * 项目名称:com.ch19    

 * 类名称:MainActivity    

 * 类描述:播放、暂停、停止、增加音量、减少音量

 * 创建人:方勇   

 * 创建时间:2012-11-29 下午1:36:47   

 * Copyright (c) 方勇-版权所有

 */

public class MainActivity extends Activity {

private Button btn_playbtn_pausebtn_stopbtn_lowbtn_height;

private SurfaceView mSurfaceView;

/* 播放视频对象 */

private MediaPlayer mediaPlayer;

/* 系统声音 */

private AudioManager audioManager;

/* 播放位置 */

private int position;

 

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setWindow();

setContentView(R.layout.activity_main);

findViews();

setListeners();

mediaPlayer = new MediaPlayer();

setSurfaceView();

}

 

// 横竖屏切换时的处理

@Override

protected void onSaveInstanceState(Bundle outState) {

if (mediaPlayer != null && mediaPlayer.isPlaying()) {

outState.putInt("position"mediaPlayer.getCurrentPosition());

}

super.onSaveInstanceState(outState);

}

 

// 横竖屏切换后的处理

@Override

protected void onRestoreInstanceState(Bundle savedInstanceState) {

if (savedInstanceState.containsKey("position")) {

position = savedInstanceState.getInt("position");

}

super.onRestoreInstanceState(savedInstanceState);

}

 

/* 实例化UI */

private void findViews() {

btn_play = (Button) findViewById(R.id.btn1);

btn_pause = (Button) findViewById(R.id.btn2);

btn_stop = (Button) findViewById(R.id.btn3);

btn_low = (Button) findViewById(R.id.btn4);

btn_height = (Button) findViewById(R.id.btn5);

mSurfaceView = (SurfaceView) findViewById(R.id.surfaceVIew);

audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);

}

 

/* 为5个按钮设置监听 */

private void setListeners() {

btn_play.setOnClickListener(onClickListener);

btn_pause.setOnClickListener(onClickListener);

btn_stop.setOnClickListener(onClickListener);

btn_low.setOnClickListener(onClickListener);

btn_height.setOnClickListener(onClickListener);

}

 

/* 屏幕为全屏、无标题 */

private void setWindow() {

requestWindowFeature(Window.FEATURE_NO_TITLE);// 无标题

 

// // 设置窗体始终点亮

// getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,

// WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

// // 设置窗体背景模糊

// getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

// 设置窗体全屏

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

}

 

/* 播放视频 */

private void playMedia() {

/* 初始化状态 */

mediaPlayer.reset();

/* 设置声音流类型 */

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

/* 设置mp3\mp4加载路径 */

File file = new File(Environment.getExternalStorageDirectory(), "sv.3gp");

try {

mediaPlayer.setDataSource(file.getAbsolutePath());

// 缓冲

mediaPlayer.prepare();

// 开始播放

mediaPlayer.start();

// 具体位置

Log.i("position"position + "------");

mediaPlayer.seekTo(position);

// 视频输出到View

mediaPlayer.setDisplay(mSurfaceView.getHolder());

// 重置位置为0

position = 0;

catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

catch (IllegalStateException e) {

// TODO Auto-generated catch block

e.printStackTrace();

catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

}

 

/* 设置surfaceView视图 */

private void setSurfaceView() {

// creates a "push" surface

mSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

// 设置事件,回调函数

mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {

/* SurfaceView创建时 */

@Override

public void surfaceCreated(SurfaceHolder holder) {

if (position > 0) {

playMedia();

position = 0;

}

}

 

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

// TODO Auto-generated method stub

 

}

 

/* SurfaceView销毁视图 */

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

if (mediaPlayer.isPlaying()) {

mediaPlayer.stop();

}

/* Activity销毁时停止播放,释放资源。不做这个操作,即使退出,还是能听到视频的声音 */

mediaPlayer.release();

}

 

});

}

 

// 设置5个按钮的监听事件

private OnClickListener onClickListener = new OnClickListener() {

 

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn1:// 播放

if (mediaPlayer != null && mediaPlayer.isPlaying()) {

return;

else {

playMedia();

}

break;

case R.id.btn2:// 暂停

if (mediaPlayer != null && mediaPlayer.isPlaying()) {

position = mediaPlayer.getCurrentPosition();

mediaPlayer.pause();

else {

return;

}

break;

case R.id.btn3:// 停止

if (mediaPlayer != null && mediaPlayer.isPlaying()) {

mediaPlayer.stop();

position = 0;

else {

return;

}

break;

case R.id.btn4:// 调小音量

// 获取当前的音乐音量

int volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

Log.v("Volume""volume" + volume);

// 音量>0

if (volume > 0) {

audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, 0);

else {

return;

}

break;

case R.id.btn5:// 调大音量

volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

// 音量<100

if (volume < audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)) {

audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);

else {

return;

}

break;

}

}

 

};

}

--------------------------------------------效果----------------------------------------------------

<!--EndFragment-->

  • 大小: 495.8 KB
0
0
分享到:
评论

相关推荐

    Android SurfaceView 实现图片缩放 滑动

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,尤其适合处理视频播放或游戏等需要连续刷新的场景。本话题主要探讨如何利用SurfaceView实现图片的缩放和滑动功能。 首先,理解...

    android surfaceview 悬浮窗圆角 windowmanager

    在Android开发中,`SurfaceView`是一个特殊类型的`View`,它允许开发者在应用程序中创建一个独立于应用程序主线程的渲染表面。`SurfaceView`通常用于处理高性能的图形或者视频播放,因为它可以在单独的线程中进行...

    android surfaceView 双缓冲

    android使用双缓冲辨析及surfaceview使用例子

    Android SurfaceView 实现实时显示摄像头视频

    `SurfaceView`是Android提供的一种用于高效显示多媒体数据的视图组件,尤其适合处理像视频流这样的实时数据。本篇文章将深入探讨如何利用`SurfaceView`实现实时显示摄像头视频。 首先,我们需要了解`SurfaceView`的...

    android surfaceview自定义拍照 绘制头像轮廓

    在Android开发中,`SurfaceView`是一个非常重要的组件,它提供了与硬件图形渲染直接交互的能力。这个项目"android surfaceview自定义拍照 绘制头像轮廓"是基于网上现有的示例代码进行了修改,用于实现一个自定义的...

    Android中SurfaceView截屏

    在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理视频播放、游戏渲染等高性能图形操作时,它的优势在于拥有独立于主线程的渲染机制,能避免阻塞UI更新。然而,由于其特殊的性质,直接通过常规...

    Android SurfaceView添加组件view不被组件覆盖.zip

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,比如游戏、视频播放等需要频繁更新画面的应用。SurfaceView有一个特点,就是它的内容在窗口的最顶层,通常不会被其他普通View...

    Android SurfaceView添加组件view不被组件覆盖-IT计算机-毕业设计.zip

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在应用程序中创建高性能的图形界面,比如游戏或者视频播放器。SurfaceView具有自己的绘制表面,与主线程分离,因此可以进行独立于UI线程的高性能渲染。...

    android SurfaceView游戏框架

    在Android平台上开发游戏时,SurfaceView是一个至关重要的组件,它为高效、低延迟的图形渲染提供了可能。SurfaceView是Android系统提供的一种特殊视图,它有自己的独立绘制表面,与主线程分离,使得游戏或者视频这类...

    Android SurfaceView使用Demo

    **Android SurfaceView 使用详解** `SurfaceView` 是 Android 系统提供的一种特殊的视图组件,它允许开发者在应用程序中创建高性能的图形界面,比如游戏、视频播放器等需要连续更新图像的应用。`SurfaceView` 提供...

    android SurfaceView做二维码扫描源码

    在Android开发中,实现二维码和一维码扫描功能通常涉及到多个关键知识点,其中包括SurfaceView的使用、摄像头控制、图像处理以及二维码识别库的集成。以下将详细解释这些内容。 首先,`SurfaceView`是Android系统...

    Android SurfaceView 多线程 滑块

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在单独的线程中进行绘制操作,从而提高图形渲染性能,特别适用于需要连续更新显示内容的应用,如游戏、视频播放等。本示例中,"Android SurfaceView 多...

    android SurfaceView实现人物动画

    在Android开发中,SurfaceView是一种特殊的视图组件,它提供了在UI线程之外进行渲染的能力,使得复杂的动画或视频播放成为可能。在这个“android SurfaceView实现人物动画”的示例程序中,我们将深入探讨如何利用...

    android surfaceview示例源码下载

    android中的surfaceview示例源码下载,Android SurfaceView在游戏开发中使用想当广泛,SurfaceView对于画面的控制有着更大的自由度,它不像View那样要用handler来更新,但是网上关于 SurfaceView使用这方面的参考...

    Android圆形相机预览窗口,圆形SurfaceView

    这个场景就涉及到了Android的SurfaceView以及如何定制它的显示效果。本文将深入探讨如何实现一个圆形的相机预览窗口。 首先,让我们理解SurfaceView的基本概念。SurfaceView是Android系统提供的一种用于显示多媒体...

    android SurfaceView添加线程源码

    在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理高性能图形和视频渲染时。`SurfaceView`提供了直接与硬件图形管道交互的能力,使得开发者可以在单独的线程中进行绘制,从而避免阻塞UI主线程,...

    Android SurfaceView实现动画效果

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在单独的线程中进行高性能的图形绘制,常用于游戏或者视频播放等需要连续更新显示内容的场景。本篇文章将详细探讨如何利用SurfaceView实现动画效果,...

    Android下使用SurfaceView播放视频文件

    在Android平台上,SurfaceView是一种特殊的视图,常用于处理高性能的图形渲染,比如播放视频或者游戏画面。在视频播放场景中,SurfaceView提供了一个高效且低延迟的显示机制,能够将视频帧直接绘制到Surface上,减少...

    Android 通过SurfaceView 实现实时显示摄像头视频

    总之,通过SurfaceView实现实时显示摄像头视频是Android开发中的一个基础任务,涉及到对Android系统相机API的理解和使用,以及对SurfaceView生命周期的掌握。随着技术的发展,开发者可以选择更高级的API,如Camera2...

    Android SurfaceView实现加载GIF动画

    在Android开发中,`SurfaceView`是一个非常重要的组件,它为高效显示动态图像和视频提供了可能。本篇文章将深入探讨如何使用`SurfaceView`来实现加载GIF动画,这是一个常见的需求,特别是在游戏开发或者需要实时渲染...

Global site tag (gtag.js) - Google Analytics