surfaceView显示方法(surfaceview的使用)

http://www.itjxue.com  2023-01-26 09:36  来源:未知  点击次数: 

SurfaceView 文本不显示

drawText函数最后一个参数要求传入Paint类的一个对象paint,你传入的是Paint类.

所以把canvas.drawText("Test",100,100,Paint);改成canvas.drawText("Test",100,100,paint);

即把Paint改成paint,应该就行了.

android surfaceview 怎么用

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

}

}

上面代码我们在SurfaceView的构造方法中执行了init初始化方法,在这个方法里,我们先获取SurfaceView里的 SurfaceHolder对象,然后通过它设置Surface的生命周期回调方法,使用DemoSurfaceView类本身作为回调方法代理类。 surfaceCreated方法,是当SurfaceView被显示时会调用的方法,所以你需要再这边开启绘制的线 程,surfaceDestroyed方法是当SurfaceView被隐藏会销毁时调用的方法,在这里你可以关闭绘制的线程。上面的例子运行后什么也不 显示,因为还没定义一个执行绘制的线程。下面我们修改下代码,使用一个线程绘制一个逐渐变大的圆圈:

[java] view plain copy print?

package com.android777.demo.uicontroller.graphics;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.view.SurfaceHolder;

import android.view.SurfaceHolder.Callback;

import android.view.SurfaceView;

public class DemoSurfaceView extends SurfaceView implements Callback{

LoopThread thread;

public DemoSurfaceView(Context context) {

super(context);

init(); //初始化,设置生命周期回调方法

}

private void init(){

SurfaceHolder holder = getHolder();

holder.addCallback(this); //设置Surface生命周期回调

thread = new LoopThread(holder, getContext());

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

android开发 surfaceView与按钮共存时,按钮的隐藏、显示问题

同理隐藏是用:btnBack.setVisibility(View.INVISIBLE);

这个View.INVISIBLE 不可见,但这个View在ViewGroupt中仍保留它的位置,不重新layout

换成view.GONE这个不可见,但是不保留原位置,更新后重新layout

SurfaceView/VideoView

我们经常用SurfaceView和VideoView来播放视频,但是这两个东东,经常都会出问题。

①SurfaceView不会添加到View树上,并且显示在所有View之上

②在按Home键的时候,会让Surface销毁,并且在重新进入APP的时候,让Surface重建,在Surface重建的时候,SurfaceView那一块是透明的,显示的会是Activity的背景

③如果是列表中的子view中播放视频,在上下滑动的时候,会导致Surface绘制不及时,会有残留

④多个VideoView同时播放的时候,在SurfaceFlinger支持不好的手机上,会出现下一个SurfaceView的某一帧会显示在上一个SurfaceView上

①VideoView是直接继承SurfaceView

②VideoView中的openVideo可能会ANR

③VideoView中的release,stopPlayBack都会导致ANR,因为这些方法都是同步执行的,并且通过IPC服务交给MediaServer去释放资源

解决方法:

使用TextureView替换SurfaceView实现VideoView,因为TextureView是直接继承View的,并且在ListView中滑动的时候,也不会在滑动的时候,有帧残留

当我们有一个列表,每个子项就是一个视频,并且自动播放。surfaceView使用的就是Android自带的状态机来控制播放,所以就会一段一段的将视频先读到缓冲区,再播放。由于MediaPlayer中的release,reset,stopPlayBack都是同步的。而且当视频卡片在滑出屏幕之后,需要把视频暂停,在不可见的时候不进行播放。节省系统资源,并且节省用户流量。而如果同时出现多个视频的时候,会频繁调用到上述生命周期方法,导致很容易出现ANR。

解决方法:

问题1.在视频划出ListView的时候,停止播放视频。

解决方案:在ListView中调用setRecycleListener,设置View回收的监听,因为ListView的重用性,会在View回收到scrap区的时候,通过这个Listener进行一些处理,所以在这里根据View.getTag,找到视频View的引用,调用stopPlayBack停止

问题2.频繁调用release等方法导致ANR

解决方案:在视频调用的时候,建立一个释放视频资源的守护线程。在Android中,直接可以用HandlerThread,因为这样可以尽可能的让资源的消耗达到最少,HandlerThread在没有新事件到来的时候,都是处于wait状态,直到有新事件的到来,才会被notify,处理新事件。它里面也是通过一个Thread,在这个Thread中新建一个Looper,在Looper中没有事件的话,则wait,一旦通过Handler发送新事件的话,则会被notify。所以会在子线程中加入一个队列,当需要release的MediaPlayer,直接丢到子线程去进行资源释放。

但是这样会导致一个问题,就是Android维护的MediaPlayer的状态机中的状态可能会乱,这时候就会抛出IllegalStateException,目前对于这种异常,我们选择了捕获它。

另外,由于MediaPlayer.setSurface需要传递一个Surface,然后再在这个Surface上进行绘制,如果频繁new Surface传入的话,就会导致GrafficBuffer分配Surface失败,从而MediaPlayer会回调onError中,显示视频不能播放。所以尽可能一个视频View用一个Surface。

如何正确的在fragment中显示surfaceview

由于在ViewPage中PageAdapter来管理所有的Fragment。在加载一个Fragment的时候,会自动缓存左右几个(默认是一个)页面,此时也会调用到正常的生命周期函数,onCreate,onCrateView,onResume.可是这样就干扰了我们统计页面打开次数。例如:一个ViewPager中存在三个页面的时候,当默认是第一个页面,并且被打开。那么在我们的后台就会收集到用户打开两个页面的信息。这个对我们的统计就是一个很大的干扰。所以就不能再将统计代码放在onResume中,要放在一个其他的函数内,但问题的关键是如何确认当前的Fragment可见?这样我才能把统计函数移植过去。同时Fragment虽然有onResume和onPause的,但是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPager搭配使用这个方法就很鸡肋了,根本不是你想要的效果,这里介绍一种方法。

(责任编辑:IT教学网)

更多

推荐ASP.NET教程文章