- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用触摸监听器在圆中的两点之间绘制弧线。这是我的代码:
public class MainActivity extends Activity implements OnTouchListener {
ImageView whiteCircle, centreCircle, slideArcFrame;
int xStart = 0, yStart = 0, xEnd = 0, yEnd = 0, centerIx = 0, centerIy = 0;
Bitmap output;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
whiteCircle = (ImageView) findViewById(R.id.centerImageWhite);
centreCircle = (ImageView) findViewById(R.id.centerImage2);
slideArcFrame = (ImageView) findViewById(R.id.centerImage);
slideArcFrame.setOnTouchListener(this);
slideArcFrame.setDrawingCacheEnabled(true);
slideArcFrame.measure(
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
slideArcFrame.layout(0, 0, slideArcFrame.getMeasuredWidth(),
slideArcFrame.getMeasuredHeight());
slideArcFrame.buildDrawingCache(true);
output = Bitmap.createBitmap(slideArcFrame.getDrawingCache());
centerIx = 100;
centerIy = 100;
}
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
if (arg1.getAction() == MotionEvent.ACTION_DOWN) {
xStart = (int) arg1.getX();
yStart = (int) arg1.getY();
}
if (arg1.getAction() == MotionEvent.ACTION_MOVE) {
xEnd = (int) arg1.getX();
yEnd = (int) arg1.getY();
drawArc();
}
if (arg1.getAction() == MotionEvent.ACTION_UP) {
xEnd = (int) arg1.getX();
yEnd = (int) arg1.getY();
}
return true;
}
private void drawArc() {
Bitmap outp = Bitmap.createBitmap(output.getWidth(),
output.getHeight(), Config.ARGB_8888);
Canvas can = new Canvas(outp);
final Paint paint = new Paint();
RectF rect = new RectF(0, 0, output.getWidth(), output.getHeight());
can.drawARGB(0, 0, 0, 0);
paint.setAntiAlias(true);
paint.setColor(getResources().getColor(R.color.white));
double quadXS, quadYS, quadXE, quadYE;
double quadrantS = 0, quadrantE = 0;
quadXS = xStart - centerIx;
quadYS = yStart - centerIy;
quadXE = xEnd - centerIx;
quadYE = yEnd - centerIy;
if (quadXS >= 0 && quadYS >= 0)
quadrantS = 1;
if (quadXS < 0 && quadYS >= 0)
quadrantS = 2;
if (quadXS < 0 && quadYS < 0)
quadrantS = 3;
if (quadXS >= 0 && quadYS < 0)
quadrantS = 4;
if (quadXE >= 0 && quadYE >= 0)
quadrantE = 1;
if (quadXE < 0 && quadYE >= 0)
quadrantE = 2;
if (quadXE < 0 && quadYE < 0)
quadrantE = 3;
if (quadXE >= 0 && quadYE < 0)
quadrantE = 4;
double startAngle = 0, endAngle = 0;
if (quadrantS == 1) {
startAngle = Math.toDegrees(Math.atan((double) (quadYS) / quadXS));
}
if (quadrantS == 2) {
startAngle = 180 - Math.toDegrees(Math.atan((double) (quadYS)
/ -quadXS));
}
if (quadrantS == 3) {
startAngle = 180 + Math.toDegrees(Math.atan((double) (-quadYS)
/ -quadXS));
}
if (quadrantS == 4) {
startAngle = 360 - Math.toDegrees(Math.atan((double) (-quadYS)
/ quadXS));
}
if (quadrantE == 1) {
endAngle = Math.toDegrees(Math.atan((double) (quadYE) / quadXE));
}
if (quadrantE == 2) {
endAngle = 180 - Math.toDegrees(Math.atan((double) (quadYE)
/ -quadXE));
}
if (quadrantE == 3) {
endAngle = 180 + Math.toDegrees(Math.atan((double) (-quadYE)
/ -quadXE));
}
if (quadrantE == 4) {
endAngle = 360 - Math.toDegrees(Math.atan((double) (-quadYE)
/ quadXE));
}
can.drawArc(rect, (float) startAngle, (float) endAngle
- (float) startAngle, true, paint);
slideArcFrame.setImageBitmap(outp);
}
}
当起始角大于终止角时,从终止角到起始角绘制圆弧。谁能解释一下?
最佳答案
对于 sweepAngle
,您正在使用 endAngle - startAngle
。如果 startAngle
更高,它将以负数结束。
The docs这么说:
If the sweep angle is negative, the sweep angle is treated as sweep angle modulo 360.
......
The arc is drawn clockwise.
事情是,Java can return negative numbers with modulus , 所以 -30 mod 360 = -30
。对于负度数,它将逆时针绘制。如果你想让它总是顺时针绘制,你需要给它一个正数:
float sweepAngle = endAngle - startAngle;
while(sweepAngle < 0)
sweepAngle += 360;
关于android - 当 startAngle > endAngle 在 android 中时,drawArc 无法正确绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19863493/
代码: int width = canvas.getWidth(); int height = canvas.getHeight(); int shift = 0; RectF rect = new
我想在 preferedSize 设置为 (200,50) 的面板中绘制此弧线: 我发现很难理解 drawArc() 中的参数是什么。这个怎么画? 最佳答案 要理解争论,请阅读 javadoc:htt
我正在尝试以与传统方式略有不同的方式绘制饼图。无论如何,馅饼的 fragment 都是相等的,但是每 block 的半径是不同的。所以所有圆弧仍然以一点为中心,但具有不同的半径。 这是它的简化代码。
我在使用 drawArc 时遇到了一些问题。当我有 4 个楔子时,它似乎很好,但是当我没有 ahve 4 个楔子(比如 10 个)时,楔子就不会正确对齐。你可以在图片中看到,有轻微的错位。有什么想法吗
我正在尝试在 Canvas 上用 AndroidScript 绘制弧线。这个方法存在吗? 谢谢 丹 [他们让我在问题中添加更多内容,所以你开始吧] 最佳答案 这是 Schnee Wittchen 在另
我正在尝试创建一个圆弧,但是当我使用相同的宽度和高度参数时,圆弧几乎是平的,不是应该更高吗?我本以为屏幕上的高度看起来与宽度相同。 public void paintComponent(Graphic
我是 Libgdx 和 box2d 的新手。我需要画弧线。我搜索了一个函数,最后我像下面这样找到了 public void drawarc (float centerx, float centery,
我有一个可绘制的仪表,我尝试在其上画一条线。 (固定位置,不固定值) 很遗憾,我没有任何绘画经验。 (而且我觉得很难理解) 目前它看起来像这样: /image/5tkXEl.png 如您所见,它的位置
我正在尝试绘制一条弧以覆盖在现有圆的某些部分之上。我的两个圆圈都画得很好,但我的 drawArc() 调用或 drawRect() 调用似乎都没有做任何事情。应用程序不会崩溃,没有异常(excepti
我在 Canvas 上的自定义 View 中绘制了一条弧线,如下所示。 Paint 和 rectangle 是在 onDraw() 之外定义的,为简单起见添加到那里。 protected void o
我正在创建一个自定义 View ,它是一种弧形 slider 进度 View 。我可以根据用户触摸的位置(在 x 轴上)通过计算扫描来绘制或多或少的弧形,我首先这样做计算用户沿 x 轴触摸的百分比。0
我有一个任务,我必须画一个八字形,所以我认为它是画四个弧线。我尝试使用 DrawArc 方法,但我真的完全不明白它是如何工作的。 DrawArc 方法有 4 个参数:1-笔。2-要绘制的矩形。3-起始
在 flutter 文档中它的状态, If useCenter is true, the arc is closed back to the center, forming a circle sect
使用最新的 flutter,我想使用 Canvas.drawArc 方法绘制一个从 0 到 10 的拱门。这是我的代码的样子: @override void paint(Canvas canvas,
我有以下自定义 View : 这是我通过使用 Canvas 的 drawArc() 方法实现的。但是,使用此 drawArc() 方法,我无法限制圆弧的内半径。 我想要的是这样的: 只剩下一个外环。
我们的软件呈现技术图纸。一个特定的绘图使应用程序每次都因 OutOfMemoryException 而崩溃。经调查,似乎没有什么异常;该应用程序没有请求大量内存,也没有使用很多句柄。我尝试捕捉异常并且
我有一个问题,当我画一个圆弧时,阴影层没有被绘制。这是我的 Paint 对象: circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); circlePaint.
我是 QT 的新手,我不明白为什么我的弧线画得这么糟糕。我有 2 个问题。 第一个,我认为对于这样的绘图来说是正常的,是:如果我用 QPainterPath 绘制一条直线,将在每个圆弧上绘制,从圆弧的
我正在尝试在 android View 中绘制 180° 弧。在 onDraw 方法中,我正在使用 Canvas::drawArc,如下所示: canvas.drawArc(arcRect, 180.
我已经实现了一个 Canvas 元素,它使用 drawarc 来创建气泡在背景上以不同速度上升的效果(这是一个为水下主题客户提供的水下主题网站)- 它看起来非常好而且我很漂亮对此很满意,但我注意到某些
我是一名优秀的程序员,十分优秀!