做了一个小图片程序,图片可以拖动
但是拖动的时候图片会有抖动,请问是什么原因,如何解决?
注:是图片抖动,不是图片闪烁,所以请不要回答设置DoubleBuffered为true;
是否有可能是图片移动的代码所造成?图片移动代码如下:
procedure Tform1.ImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: Integer);
begin
flag:=true;
ox:=x;
oy:=y;
end;procedure TForm1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
if flag then
begin
image1.Left:=image1.Left+(x-ox);
image1.Top:=image1.Top+(y-oy);
end;
end;procedure Tform1.ImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: Integer);
begin
flag:=false;
end;
但是拖动的时候图片会有抖动,请问是什么原因,如何解决?
注:是图片抖动,不是图片闪烁,所以请不要回答设置DoubleBuffered为true;
是否有可能是图片移动的代码所造成?图片移动代码如下:
procedure Tform1.ImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: Integer);
begin
flag:=true;
ox:=x;
oy:=y;
end;procedure TForm1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
if flag then
begin
image1.Left:=image1.Left+(x-ox);
image1.Top:=image1.Top+(y-oy);
end;
end;procedure Tform1.ImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: Integer);
begin
flag:=false;
end;
首先这个问题可以采取去抖的办法消除掉抖动的:
比如
procedure TForm1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
if flag then
begin
if (abs(x-ox)<2) and (abs(y-oy)<2) then //如果移动小于2个像素,不动
exit
else
begin
image1.Left:=image1.Left+(x-ox);
image1.Top:=image1.Top+(y-oy);
end;
end;
end; 这就回带来问题,如果用户就想移动1个象素怎么办?当然你可以加时间进行判断,如果用户就想快,又如何?
所以,这个问题与需求是有关系的。