[英]Error in drawing on surfaceview on camerapreview android camera2 api?
我正在嘗試在相機預覽的surfaceview
上繪制一個矩形。 我有一個自定義視圖類,該類擴展了SurfaceView
類並實現了surfaceholder
回調。 現在的問題是,當我運行我的應用程序時,我看到一個黑色背景,而沒有看到相機預覽。 可能是什么問題呢。 這是我到目前為止嘗試過的。
public class OverlayTextureView extends SurfaceView implements SurfaceHolder.Callback {
private final Paint paint;
private final SurfaceHolder mHolder;
private final Context context;
public OverlayTextureView(Context context) {
this(context,null);
setWillNotDraw(false);
}
public OverlayTextureView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public OverlayTextureView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mHolder = getHolder();
mHolder.setFormat(PixelFormat.TRANSPARENT);
this.context = context;
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.STROKE);
}
@Override
protected void onDraw(Canvas canvas) {
drawMyStuff(canvas);
}
private void tryDrawing(SurfaceHolder holder) {
Log.i("Sv", "Trying to draw...");
Canvas canvas = holder.lockCanvas();
if (canvas == null) {
Log.e("Sv", "Cannot draw onto the canvas as it's null");
} else {
drawMyStuff(canvas);
holder.unlockCanvasAndPost(canvas);
}
}
private void drawMyStuff(final Canvas canvas) {
int x = canvas.getWidth();
int y = canvas.getHeight();
paint.setColor(Color.GREEN);
paint.setStyle(Paint.Style.STROKE);
Rect rect = new Rect(50, 50, x - 300, y - 300);
canvas.drawRect(rect, paint);
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
tryDrawing(surfaceHolder);
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
tryDrawing(surfaceHolder);
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rlv"
>
<RelativeLayout
android:id="@+id/vwMainContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff">
<TextView
android:id="@+id/putstuffs"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_alignParentStart="true"
android:layout_marginBottom="14dp"
android:text="Timer"
android:textColor="#ff0000" />
<com.example.OverlayTextureView
android:id="@+id/overlay"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
>
</com.example.OverlayTextureView>
<TextureView
android:id="@+id/texture"
android:layout_width="480dp"
android:layout_height="640dp"
android:layout_alignParentStart="true">
</TextureView>
</RelativeLayout>
<Button
android:id="@+id/picture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="@string/picture" />
</RelativeLayout>
片段類
RelativeLayout mVwMainContainer;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view =inflater.inflate(R.layout.fragment_camera2_basic, container, false);
mVwMainContainer = (RelativeLayout) view.findViewById(R.id.vwMainContainer);
mVwMainContainer.addView(new OverlayTextureView(getActivity()));
return view;
}
@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
view.findViewById(R.id.picture).setOnClickListener(this);
mSurfaceView = (TextureView) view.findViewById(R.id.texture);
appendinstructions = (TextView) view.findViewById(R.id.putstuffs);
mOverlay = view.findViewById(R.id.overlay);
holder = mOverlay.getHolder();
}]
我過去使用的解決方案要簡單得多:
SufraceView
相機SufraceView
! onDraw(Canvas)
因此,例如:
public class RectangleDrawerView extends View {
private Paint mPaint;
public RectangleDrawerView(Context context, AttributeSet attrs) {
super(context, attrs);
// Set up the pen: 10pt, no fill
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(10.0f);
mPaint.setStyle(Paint.Style.STROKE);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(10, 10, 20, 20, mPaint);
}
}
然后在布局中,例如:
<SurfaceView
android:id="@+id/preview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"/>
<com.me.myapp.RectangleDrawerView
android:id="@+id/overlayView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false"
android:focusable="false"
android:hapticFeedbackEnabled="false"
android:longClickable="false"
android:scrollbarAlwaysDrawHorizontalTrack="false"
android:scrollbarAlwaysDrawVerticalTrack="false"
android:soundEffectsEnabled="false" />
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.