我想问一下这里已经解决过一两次的问题,但我发现的任何信息都无法帮助我克服几天前遇到的问题.
我想使用画布为Android制作一个动态壁纸 - 它的图形复杂程度不足以要求OpenGL.为简单起见,假设它由实心背景和两个较小的矩形组成.绘图由三个独立的阶段组成(单线程):
我在多个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新手,所以我的设计基于示例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) 我将使用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) 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)
以上代码工作正常但是,视频的质量与我在本机安卓摄像头拍摄的视频不一样,我使用媒体录像机录制的视频质量较差,与原生录像机相比,我怎样才能提高视频质量.
如果有人知道帮助我.谢谢
我已经找到了几个问题,但没有答案,所以这里希望有人可能有一些见解.当我尝试交换相机时,我调用下面的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) 因此,我花了大约两天的时间来获取可用的SurfaceView。即使遵循这封信,我在网上关注的教程也无法使用。我通常会看到一个全黑的屏幕。
为了帮助我自己教它如何工作,我需要一个有效的SurfaceView程序。
我正在寻找一个在单独的类中生成SurfaceView的程序。如果有人能够发布用于将整个屏幕变成红色或白色的SurfaceView程序的完整代码(XML和Java),我将不胜感激。
感谢您的任何帮助!
(任何解释以及代码都会很棒!)
我将简单地使用相机生成录像机应用程序。但它崩溃了并给我一个波纹管错误:
尝试在空对象引用上调用虚拟方法 '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) 我想编写一个让球在屏幕上移动的程序,因此,我阅读了很多教程,但无法理解这一行:
mHolder = getHolder();
mHolder.addCallback(this);
Run Code Online (Sandbox Code Playgroud)
this
方法中的“”参数是什么addCallback
?为什么我使用这个方法?我读到了SurfaceView
and SurfaceHolder
,Canvas
但我不太明白。SurfaceHolder
它有什么作用?
我知道也许我的问题很愚蠢,但这是一个问题!请解释一下这个概念。
我正在SurfaceView
使用camera.startPreview();
. 关于如何从相机获取实时 RGB 读数的任何想法?
谢谢
我的观点是一堆普通的小部件和一个表面视图.我不知道为什么在得到surfaceholder
SurfaceView并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 ×10
surfaceholder ×10
surfaceview ×5
java ×3
camera ×1
canvas ×1
colors ×1
popupwindow ×1
rgb ×1