我正在尝试使用Bitmap绘制圆圈。
每次单击鼠标时,我之前绘制的圆圈都会移动到新位置。
我想要发生的是:每次单击鼠标时,都会在我单击的位置创建/绘制一个新圆圈,并且所有先前绘制的圆圈都保持不动。
我正在使用以下代码:
#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet AnimatableView *animableView;
@end
@implementation ViewController
- (void)animateAlongPath
{
UIBezierPath * path = [UIBezierPath bezierPathWithRect:self.view.frame];
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
animation.duration = 10;
animation.path = path.CGPath;
animation.removedOnCompletion = NO;
animation.fillMode = @"kCAFillModeForwards";
[self.animableView.layer addAnimation:animation forKey:@"animation"];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)animate:(id)sender {
[self animateAlongPath];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView: [touch view]];
CALayer * selectedlayer = (CALayer*)[self.animableView.layer.presentationLayer hitTest:location];
if(selectedlayer != nil)
NSLog(@"touched");
else
NSLog(@"dont touched");
}
@end
答案 0 :(得分:2)
你的英语有点令人困惑。如果我正确地理解你的问题,那么现在唯一被绘制的就是点击所在的新圈子,你想要所有旧的圈子也一直存在?在这种情况下,有两种选择:
rectangleObj
将清除您刚绘制的位图。如果删除该行并且不清除位图,则下次单击时,它将在最后一个位图的顶部绘制新的椭圆。rectangleObj
列表。每次单击时,都会将该点添加到T.get('application/rate_limit_status', { resources: 'statuses' }, showRTLimit);
function showRTLimit(err, data, response){
var showRTLim = data.resources.statuses['/statuses/show/739695095222390785'].remaining;
console.log(showRTLim);
}
集合中。然后在你的draw方法中,你将迭代整个集合并绘制所有这些。答案 1 :(得分:1)
我注意到了一些事情。首先,在Form1_MouseDown()
中,你有这个:
clickCurrent = PointToClient(Cursor.Position);
clickPrev = clickCurrent;
在您保存之前,您将覆盖旧位置(clickPrev
)。如果你想保留两个位置,你应该把它们放在一个简单的结构中,比如List。获得新点后,只需将Add()
添加到列表中即可。然后,在Draw()
例程中,遍历列表中的所有元素并将它们全部绘制出来。
如果你只想要两个职位 - 只有两个职位 - 只需交换你的陈述:
clickPrev = clickCurrent;
clickCurrent = PointToClient(Cursor.Position);
你必须为绘图分配另一个矩形对象,尽管在Draw()
例程中处理这个更有意义。
答案 2 :(得分:1)
交换以下陈述的位置
var upload_file = function (file, response) {
var formData = new FormData();
formData.append('image', file);
return $http({
method: 'PUT',
url: response.signed_request,
data: formData,
headers: {
'Content-Type': file.type
},
cache: true
});
};
我认为您在初始化clickCurrent = PointToClient(Cursor.Position);
clickPrev = clickCurrent;
后将clickCurrent
分配给clickPrevious
。它需要是另一种方式。
答案 3 :(得分:1)
请试试这个
Rectangle rectangleObj;
Bitmap background;
Graphics scG;
Pen myPen;
private void Form1_Load(object sender, EventArgs e)
{
rectangleObj = new Rectangle(10, 10, 30, 30);
background = new Bitmap(Width, Height);
scG = Graphics.FromImage(background);
myPen = new Pen(Color.Red, 3);
BackgroundImage = background;
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
var point = PointToClient(Cursor.Position);
rectangleObj.X = point.X - rectangleObj.Height / 2;
rectangleObj.Y = point.Y - rectangleObj.Width / 2;
scG.DrawEllipse(myPen, rectangleObj);
Refresh();
}
已删除 OnPaint
和Draw
个方法。以及clickCurrent
和clickPrev
字段。
当您更改表单大小(例如,最大化它)时,位图和图形保持不变,因此您可以获得此效果。为避免这种情况,您需要添加事件处理程序
private void Form1_SizeChanged(object sender, EventArgs e)
{
background = new Bitmap(Width, Height);
scG = Graphics.FromImage(background);
BackgroundImage = background;
}
请注意,每次调整表单大小时,以前绘制的所有内容都将被删除。如果这是不合需要的,则需要采用不同的方法进行绘图。让我知道,我将再举一个例子。