SurfaceView в DELPHI 12 всегда имеет черный фон.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 SurfaceView в DELPHI 12 всегда имеет черный фон.

Сообщение Anonymous »

Я написал приложение для 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. Я думаю, что с помощью прослушивателя поверхность была построена успешно.
Но почему она всегда отображается черным цветом? Результаты рисования кистью не показаны.

Код: Выделить всё

unit Unit1;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,Androidapi.Helpers,
Androidapi.JNI.GraphicsContentViewText,   FMX.Helpers.Android,    FMX.Surfaces
,  Androidapi.JNI.App,androidapi.JNIBridge,Androidapi.JNI.JavaTypes,
FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts,Androidapi.JNI.Embarcadero,
Androidapi.JNI.Widget,FMX.Objects,fmx.Platform.Android,fmx.Platform,
FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base,
FMX.ListView,  Androidapi.JNI.Os;

type
TForm1 = class(TForm)
Button1: TButton;
GridPanelLayout1: TGridPanelLayout;
Layout1: TLayout;
Layout2: TLayout;
Image1: TImage;
Button2: TButton;
ListView1: TListView;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TMySurfaceView_callback = class(TJavaLocal, JSurfaceHolder_Callback)
private
FSurfaceHolder: JSurfaceHolder;
paint:jPaint;
count:integer;
mPath:jpath;
isDraw:boolean;
public
constructor Create;
procedure Release;
procedure SurfaceChanged(holder: JSurfaceHolder; format: Integer; width, height: Integer); cdecl;
procedure SurfaceCreated(holder: JSurfaceHolder); cdecl;
procedure SurfaceDestroyed(holder: JSurfaceHolder); cdecl;
procedure draw;
procedure moveTo(x,y:single);
procedure quadTo(x,y,w,h:single);
end;
myView_OnTouchListener = class(TJavaLocal,JView_OnTouchListener)

public
constructor Create;
function onTouch(v: JView; event: JMotionEvent ) :boolean;cdecl;//override;
//          function onTouchEvent(event: jMotionEvent): boolean;
end;
var
Form1: TForm1;
SurfaceView: jSurfaceView;
mythread:tmythread;

implementation

{$R *.fmx}
{$R *.LgXhdpiPh.fmx ANDROID}
{$R *.LgXhdpiTb.fmx ANDROID}

uses FMX.Graphics.Android;

{ TMySurfaceView }

constructor TMySurfaceView_callback.Create;
var
LayoutParams: JFrameLayout_LayoutParams;
SurfaceFrameLayout:jframelayout;
myView_OnTouchListener1:myView_OnTouchListener;
begin
inherited Create;
SurfaceView := TJSurfaceView.JavaClass.init(TAndroidHelper.Context);
FSurfaceHolder := Surfaceview.getHolder;
FSurfaceHolder.addCallback(Self);
FSurfaceHolder.setKeepScreenOn(true);
SurfaceView.setVisibility(0);
SurfaceView.setFocusable(true);
SurfaceView.setFocusableInTouchMode(true);
SurfaceView.setKeepScreenOn(true);
//  surfaceView.getHolder.setFormat(-2);  //-3 半透明
surfaceView.setzOrderOnTop(true);
myView_OnTouchListener1:=myView_OnTouchListener.Create;
Surfaceview.setOnTouchListener(myView_OnTouchListener1 );
LayoutParams := TJFrameLayout_LayoutParams.JavaClass.init(800,1000);
LayoutParams.topMargin:=500;
LayoutParams.leftMargin:=200;
TAndroidHelper.Activity.addContentView(Surfaceview, LayoutParams) ;
mpath:=tjpath.JavaClass.init;
paint:=TJPaint.JavaClass.init;
paint.setColor($FF0000);
paint.setStrokeWidth(57);
paint.setStyle(TJPaint_Style.JavaClass.FILL_AND_STROKE);
paint.setTextSize(50);
paint.setTextAlign(TJpaint_align.JavaClass.CENTER);
end;

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);

mLastX := x;
mLastY := y;
form1.ListView1.items.Add.Text:='X:'+FloatToStr(x)+','+ 'y:'+FloatToStr(y)
end;
1:  //tjMotionEvent.JavaClass.ACTION_UP
;
end;

result:=true;

end;

end.

ПРИЛОЖЕНИЕ

Подробнее здесь: https://stackoverflow.com/questions/783 ... background
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»