标签: surfaceholder

带有SurfaceHolder.lockCanvas的LiveWallpaper(Rect脏)

我想问一下这里已经解决过一两次的问题,但我发现的任何信息都无法帮助我克服几天前遇到的问题.

我想使用画布为Android制作一个动态壁纸 - 它的图形复杂程度不足以要求OpenGL.为简单起见,假设它由实心背景和两个较小的矩形组成.绘图由三个独立的阶段组成(单线程):

  1. backgroundDraw()请求整个画布锁并在其上绘制纯色
  2. draw1()请求部分(Rect r1)锁定并仅在锁定的矩形上绘制
  3. draw2()请求部分(Rect r2)锁定并仅在锁定的矩形上绘制

我在多个Android版本(模拟器和设备)上测试了它:2.1,2.2,2.3.3.它似乎只适用于后者(这里:http://home.elka.pw.edu.pl/~pgawron/include/Android/android_233.jpg).在以前的Android版本中,SurfaceHolder.lockCanvas(Rect dirty)调整大小(!)脏参数作为参数传递到全屏大小,并使用它进一步绘制结果在整个屏幕上绘图(这里:http://home.elka.pw.edu .pl/~pgawron/include/Android/android_22.jpg).事实上,我可以看到每个矩形是如何被绘制的(全屏):整个屏幕很快就会改变它的颜色.

不幸的是谷歌找不到任何关于lockCanvas(Rect脏)用法的正确例子.下面我附上我用于测试目的的完整且唯一的类.可以在提供屏幕截图的位置访问完整的eclipse项目.

如果有人能够最终帮助我并更正我的代码(如果我的代码中只有问题),我将非常感激.我真的浪费了太多时间.

BR,

彼得雷利

package sec.polishcode.test;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.SystemClock;
import android.service.wallpaper.WallpaperService;
import android.util.Log;
import android.view.SurfaceHolder;

public class TestLiveWallpaper extends WallpaperService{

@Override
public Engine onCreateEngine() {
    return new MyEngine();
}

class MyEngine extends Engine implements SurfaceHolder.Callback {

    private final String LOGTAG = MyEngine.class.getSimpleName();
    private Paint backgroundPaint = new Paint();
    private Paint mPaint1 = new …
Run Code Online (Sandbox Code Playgroud)

android surfaceholder

5
推荐指数
1
解决办法
3129
查看次数

SurfaceHolder.lockCanvas()返回null

我正在制作一款游戏,因为我是Android新手,所以我的设计基于示例LunarLander代码.在它的设计中,GameThread.doStart()调用from GameActivity,然后线程从其GameThread.run()循环运行所有内容,如下所示(为清楚起见,大部分代码已被删除):

public class GameActivity extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        gameView = new GameView(this);
        fl = new FrameLayout(this);
        fl.addView(gameView);

        setContentView(fl);

        gameThread = gameView.getThread();
        gameThread.doStart();
    }
}
Run Code Online (Sandbox Code Playgroud)

.

class GameThread extends Thread
{
    public void doStart()
    {
    }

    public void run()
    {
        while (running)
        {
            Canvas c = null;
            try
            {
                c = mSurfaceHolder.lockCanvas();
                // Use canvas
            }
            finally
            {
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为了解决我遇到的一些问题,我试图将更多控制权交给GameActivity,如下所示:

public class GameActivity extends Activity
{ …
Run Code Online (Sandbox Code Playgroud)

android surfaceholder

5
推荐指数
1
解决办法
2万
查看次数

SurfaceView在PopupWindow中无法正常工作

我将使用PopupWindow基于三星SPen的AirView功能显示预览

但问题是SurfaceView没有创建,也没有SurfaceHolder.Callback调用方法.

显示弹出窗口时,表面区域变为透明,因为根本不创建表面.

SurfaceView 没有创建并且是透明的:

在此输入图像描述

HoverPreview:

public class HoverPreview extends LinearLayout implements View.OnHoverListener, SurfaceHolder.Callback {
    private static final String TAG = "HoverPreview";
    private SurfaceHolder mHolder = null;
    View mAnchorView = null;
    String videoPath;
    int position;
    private boolean IsMediaPlayerReady = false;
    private MediaPlayer mMediaPlayer;
    private SurfaceView mSurfaceView;
    Context context;

    public HoverPreview(Context context, String videoPath, int position) {
        super(context);
        this.videoPath = videoPath;
        this.position = position;
        setupLayout(context);
    }

    public HoverPreview(Context context, AttributeSet attrs) …
Run Code Online (Sandbox Code Playgroud)

android popupwindow surfaceview surfaceholder

5
推荐指数
1
解决办法
2020
查看次数

无法为媒体记录器设置视频质量.视频会产生闪烁的视频

mMediaRecorder = new MediaRecorder();
    // Step 1: Unlock and set camera to MediaRecorder
    mCamera.unlock();
    mMediaRecorder.setCamera(mCamera);
    // Step 2: Set sources
    // activate this for recording with sound\

    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    mMediaRecorder.setVideoSize(getMaxSupportedVideoSize().width,getMaxSupportedVideoSize().height);

    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

    // Step 4: Set output file
    mMediaRecorder.setOutputFile(getOutputMediaFile("movie"));

    // Step 4: Set output file
    mMediaRecorder.setOutputFile(getOutputMediaFile("movie"));


    // Step 5: Set the preview output
    mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

    mMediaRecorder.setOrientationHint(90);
Run Code Online (Sandbox Code Playgroud)

以上代码工作正常但是,视频的质量与我在本机安卓摄像头拍摄的视频不一样,我使用媒体录像机录制的视频质量较差,与原生录像机相比,我怎样才能提高视频质量.

如果有人知道帮助我.谢谢

android surfaceholder android-mediarecorder

5
推荐指数
1
解决办法
3513
查看次数

Android Camera:app传递了NULL表面

我已经找到了几个问题,但没有答案,所以这里希望有人可能有一些见解.当我尝试交换相机时,我调用下面的swapCamera功能.然而,相机预览只是冻结(虽然只是实时相机预览,应用程序不会冻结).

当我第一次打开应用程序时,一切正常.但是我注意到一些有趣的事 当我注销_surfaceHolder对象的memoryaddress(即我的SurfaceHolder对象)时,它给了我一个值,但每当我在应用程序完成启动后查询该值时,该内存地址都已更改.

更进一步,当我换掉相机时它给我的错误是非常令人困惑的.我在将它传递给摄像机之前注销了_surfaceHolder, _camera.setPreviewDisplay(_surfaceHolder); 并且在传入之前它不是null.

任何帮助是极大的赞赏.

我注意到了一些有趣的行为

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback
{
    private SurfaceHolder _surfaceHolder;
    private Camera _camera;
    boolean _isBackFacing;

    public CameraPreview(Context context, Camera camera) {
        super(context);
        _camera = camera;
        _isBackFacing = true;

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        _surfaceHolder = getHolder();
        _surfaceHolder.addCallback(this);
    }

    void refreshCamera()
    {
        try {
            _camera.setPreviewDisplay(_surfaceHolder);
            _camera.startPreview();
        } catch (IOException e) {
            Log.d("iCamera", "Error setting camera preview: " + e.getMessage());
        } …
Run Code Online (Sandbox Code Playgroud)

java android surfaceview android-camera surfaceholder

5
推荐指数
1
解决办法
4638
查看次数

SurfaceView示例

因此,我花了大约两天的时间来获取可用的SurfaceView。即使遵循这封信,我在网上关注的教程也无法使用。我通常会看到一个全黑的屏幕。

为了帮助我自己教它如何工作,我需要一个有效的SurfaceView程序。

我正在寻找一个在单独的类中生成SurfaceView的程序。如果有人能够发布用于将整个屏幕变成红色或白色的SurfaceView程序的完整代码(XML和Java),我将不胜感激。

感谢您的任何帮助!

(任何解释以及代码都会很棒!)

java android canvas surfaceview surfaceholder

5
推荐指数
2
解决办法
6810
查看次数

尝试在空对象引用上调用虚拟方法“android.view.SurfaceHolder android.view.SurfaceView.getHolder()”

我将简单地使用相机生成录像机应用程序。但它崩溃了并给我一个波纹管错误:

尝试在空对象引用上调用虚拟方法 'android.view.SurfaceHolderandroid.view.SurfaceView.getHolder()'

Capture Video Activity.class

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.hardware.camera2.CameraCharacteristics;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ToggleButton;

import static android.provider.MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE;
import static android.provider.MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO;

    public class CaptureVideoActivity extends Activity implements SurfaceHolder.Callback {

        private MediaRecorder mMediaRecorder;
        private Camera mCamera;
        private SurfaceView mSurfaceView;
        private SurfaceHolder mHolder;
        private View mToggleButton;
        private boolean mInitSuccesful;
        CameraCharacteristics characteristics;

        @Override
        public …
Run Code Online (Sandbox Code Playgroud)

java android surfaceview android-camera surfaceholder

5
推荐指数
1
解决办法
1667
查看次数

了解 SurfaceHolder 概念

我想编写一个让球在屏幕上移动的程序,因此,我阅读了很多教程,但无法理解这一行:

mHolder = getHolder();
mHolder.addCallback(this);
Run Code Online (Sandbox Code Playgroud)

this方法中的“”参数是什么addCallback?为什么我使用这个方法?我读到了SurfaceViewand SurfaceHolderCanvas但我不太明白。SurfaceHolder它有什么作用?

我知道也许我的问题很愚蠢,但这是一个问题!请解释一下这个概念。

android surfaceholder

4
推荐指数
1
解决办法
5341
查看次数

从显示实时摄像头的 SurfaceView 获取 RGB

我正在SurfaceView使用camera.startPreview();. 关于如何从相机获取实时 RGB 读数的任何想法?

谢谢

rgb camera android colors surfaceholder

4
推荐指数
1
解决办法
2万
查看次数

Android:holder.getSurface()始终返回null

我的观点是一堆普通的小部件和一个表面视图.我不知道为什么在得到surfaceholderSurfaceView并getSurface()再次使用holder之后,我将始终返回null.

这是我的示例代码:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view);
    }

    @Override
    public void onResume() {
        super.onResume();
        surface = (SurfaceView) findViewById(R.id.surfaceView);
        this.holder = surface.getHolder();

         if (holder.getSurface().isValid()){  // get surface again
             Log.i("Notice","Surface holder is valid");
         }
         else
             Log.i("Notice","Surface holder ISNOT valid");  //Always receive this
        }
Run Code Online (Sandbox Code Playgroud)

当我看到Android文档的getSurface()方法时.这是怎么说的:

直接访问表面对象.Surface可能并不总是可用 - 例如,在使用SurfaceView时,在将视图附加到窗口管理器并执行布局以确定Surface的尺寸和屏幕位置之前,不会创建支架的Surface.因此,您通常需要实现Callback.surfaceCreated以找出Surface何时可用.

我不太了解这一点,但我知道我错过了一些东西.请为我解释,并告诉我有关Callback.surfaceCreated手段,以及如何实施它?

谢谢 :)

android surfaceview android-layout surfaceholder

3
推荐指数
1
解决办法
7468
查看次数