Я написал приложение для Android для рисования SurfaceView в DELPHI 12. SurfaceView всегда показывал черный фон без каких-либо следов кисти. Ниже приведен полный код, пожалуйста, помогите мне найти проблему. Спасибо.
Определите класс TMySurfaceView_callback для реализации интерфейса JSurfaceHolder_Callback и определите переменные-члены типа jpaint, jpath и JSurfaceHolder для последующих операций.
В методе построения TMySurfaceView_callback используйте TJSurfaceView .JavaClass.init(TAndroidHelper.Context) для непосредственного создания экземпляра SurfaceView и установите переменные-члены типа jpaint, jpath и JSurfaceHolder экземпляра TMySurfaceView_callback.
Создайте макет TJFrameLayout_LayoutParams, а TAndroidHelper.Activity.addContentView(Surfaceview, LayoutParams) добавьте вид поверхности в
окно программы.
Рисование в TMySurfaceView_callback.SurfaceCreated (держатель: JSurfaceHolder). Получите холст и вызовите метод рисования. Фактически, после входа в этот метод SurfaceView отображает только черный фон, и то же самое происходит после входа в поток для выполнения.
Я также настроил прослушиватель касаний для SurfaceView. Я думаю, что с помощью прослушивателя поверхность была построена успешно.
Но почему она всегда отображается черным цветом? Результаты рисования кистью не показаны.
Я написал приложение для Android для рисования SurfaceView в DELPHI 12. SurfaceView всегда показывал черный фон без каких-либо следов кисти. Ниже приведен полный код, пожалуйста, помогите мне найти проблему. Спасибо. Определите класс TMySurfaceView_callback для реализации интерфейса JSurfaceHolder_Callback и определите переменные-члены типа jpaint, jpath и JSurfaceHolder для последующих операций. В методе построения TMySurfaceView_callback используйте TJSurfaceView .JavaClass.init(TAndroidHelper.Context) для непосредственного создания экземпляра SurfaceView и установите переменные-члены типа jpaint, jpath и JSurfaceHolder экземпляра TMySurfaceView_callback. Создайте макет TJFrameLayout_LayoutParams, а TAndroidHelper.Activity.addContentView(Surfaceview, LayoutParams) добавьте вид поверхности в окно программы. Рисование в TMySurfaceView_callback.SurfaceCreated (держатель: JSurfaceHolder). Получите холст и вызовите метод рисования. Фактически, после входа в этот метод SurfaceView отображает только черный фон, и то же самое происходит после входа в поток для выполнения. Я также настроил прослушиватель касаний для SurfaceView. Я думаю, что с помощью прослушивателя поверхность была построена успешно. Но почему она всегда отображается черным цветом? Результаты рисования кистью не показаны. [code]unit Unit1;
procedure TMySurfaceView_callback.draw; var Canvas: JCanvas; NewThread: TThread; begin // while isDraw do begin NewThread := TThread.CreateAnonymousThread( procedure begin TRY count:=count+1; Canvas := FSurfaceHolder.lockCanvas; Canvas.drawColor($FA8072,TJPorterDuff_Mode.JavaClass.clear) ; Canvas.drawCircle(100,100,100,paint); Canvas.drawCircle(200,200,20,paint); Canvas.drawText(stringtoJstring('canvas text:--'+inttostr(count)),500,300,paint) ; Canvas.drawPath(mPath, Paint); TThread.Synchronize(nil, procedure begin // 更新UI组件 form1.Button2.Text:='Runing...'; end );
finally FSurfaceHolder.unlockCanvasAndPost(Canvas); end; end ); NewThread.FreeOnTerminate := True; // 确保线程执行完毕后自动释放资源 NewThread.Start; // 启动新线程 end end;
procedure TMySurfaceView_callback.moveTo(x, y: single); begin mPath.moveTo(x, y); end;
procedure TMySurfaceView_callback.quadTo(x, y, w, h: single); begin mPath.quadTo(x, y, (x + w) / 2, (y + h) / 2); end;
procedure TMySurfaceView_callback.Release; begin FSurfaceHolder.removeCallback(Self); inherited; end;
procedure TMySurfaceView_callback.SurfaceChanged(holder: JSurfaceHolder; format, width, height: Integer); var Canvas: JCanvas; begin // showmessage('SurfaceChanged'); end;
procedure TMySurfaceView_callback.SurfaceCreated(holder: JSurfaceHolder); var Canvas: JCanvas; bmp:jbitmap; begin // 获取画布并绘制内容 showmessage('SurfaceCreated'); if not (FSurfaceHolder.getSurface.isValid) then begin showmessage('播放器设置或销毁显示区域失败!'); end; isDraw:=true; bmp:=tjbitmap.JavaClass.createBitmap(800,1000,TJBitmap_Config.JavaClass.ARGB_8888); bmp.eraseColor($FA8072); Canvas := FSurfaceHolder.lockCanvas; Canvas.drawBitmap(bmp,0,0,paint); // Canvas.drawColor($FA8072) ; FSurfaceHolder.unlockCanvasAndPost(Canvas); draw; end;
procedure TMySurfaceView_callback.SurfaceDestroyed(holder: JSurfaceHolder); begin // 释放资源 showmessage('SurfaceDestroyed'); isDraw:=false; end;
// 在你的TSurfaceView的事件中使用TCustomCanvas来绘制动画 procedure TForm1.Button1Click(Sender: TObject); // 使用TMySurfaceView var MySurfaceView: TMySurfaceView_callback; begin MySurfaceView := TMySurfaceView_callback.Create; end;
procedure TForm1.Button2Click(Sender: TObject); begin // TSurfaceView.mSurfaceHolder_Callback.isDraw:=false; end;
{ myView_OnTouchListener }
constructor myView_OnTouchListener.Create; begin inherited Create; end;
function myView_OnTouchListener.onTouch(v: JView;event: jMotionEvent): boolean; var x,y,dx,dy,mLastX,mLasty:single; begin form1.ListView1.items.Clear; x := event.getX; y := event.getY; // showmessage('touch me at x,y: '+FloatToStr(x)+','+FloatToStr(y)); case (event.getAction) of 0: //tjMotionEvent.JavaClass.ACTION_DOWN TSurfaceView. begin mLastX := x; mLastY := y; // TMySurfaceView_callback.moveTo(mLastX, mLastY); end; 2: //tjMotionEvent.JavaClass.ACTION_MOVE begin dx :=abs(x - mLastX); dy := abs(y - mLastY); if (dx >= 3) and (dy >= 3) then // TMySurfaceView_callback.quadTo(mLastX, mLastY, (mLastX + x) / 2, (mLastY + y) / 2);