我正在尝试制作一个应用视图,当出现减法问题时,会显示一个不断增长的矩形(或粗线)的动画,它将数字线爬到该整数。
我已经设置了一些内容,以便点击“显示我!”#34;并且沿着显示减数,减数和差异的数字线绘制条形图,但是我希望能够使正数的正方向向上爬行,从零向负数消极方向。
在查看文档时,似乎有几种不同的方法可以解决这个问题。我希望有人可以建议一种对于这个新手来说实现起来相当简单的方法。以下是我发现的不同方法:
这似乎非常像这个人希望有一个条形图,其中栏杆弹出,"但它没有答案。 Android Animated Bar Chart (invalidate())
我已经仔细阅读了http://developer.android.com/guide/topics/resources/drawable-resource.html - 但我没有" drawable"因为它是在视图中绘制的。我考虑将数字线的其余部分设为每Android View.getDrawingCache returns null, only null个背景位图,但我想要三个矩形(用于minuend,subtrahend和difference)。
我曾想过制作一系列矩形绘图并逐帧显示它们以显示增长。
我看过Animation at a specified rate using canvas / Ondraw但是无法分辨出包含在内的代码"如果"声明,如果事实上我的问题是重新绘制...
我查看了使用Paths - 并将以下代码放在一起。如果方向很重要,那么看起来我应该能够放慢速度并观察朝那个方向前进的道路,但它是瞬间完成的。我发现我在http://www.curious-creature.org/2013/12/21/android-recipe-4-path-tracing/
看到了一个例子if (minuendLength > 0) // start at 0 and go to the minuend length
{
path.addRect(interpX(0), yPosition(40), interpX(minuendLength), yPosition(43) , Path.Direction.CW);
// interpX lets me say what number on the number line it should align with;
//yPosition is percent of the way down the screen.
canvas.drawPath(path,minuendPaint);
// Seems same as drawRect -- instantaneous.
}
('背景'代码中的数字行如下所示,输入了不同大小的整数的不同选项:
if ( (minuendLength <10 && subtrahendLength <10 ) && (minuendLength >-10 && subtrahendLength >-10 ) )
{
this.setLineDimension(10); // default
super.onDraw(canvas);
canvas.drawLine(interpX(-this.getLineDimension()), yPosition(52 ),
interpX(this.getLineDimension()), yPosition(52), axisPaint);
int step = this.getLineDimension()/5; // so you're not writing *all* the numbers
// when they enter numbers and you make your own number line.
// paints the little hatch marks
for (int x = -this.getLineDimension(); x <= this.getLineDimension(); x+=step/2)
canvas.drawLine(interpX(x), yPosition(52), interpX(x), yPosition(53) , littleAxisPaint);
// draw the numbers on the hatch marks
textPaint.setTextAlign(Paint.Align.CENTER);
for (int x = -this.getLineDimension() + step; x < this.getLineDimension(); x += step)
{
canvas.drawText(Integer.toString(x), interpX(x), yPosition(56), textPaint);
}
}
答案 0 :(得分:0)
我最终使用Runnables这样做了。
animate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if ( ((addend1 > 0) && (addend2 < 0)) )
{
tempNum1 =addend1 ;
tempNum2 = addend2;
h.post(shrink1bigger);
}
else if (addend1 < 0 && addend2 > 0)
{
tempNum1 =addend1 ;
tempNum2 = addend2;
h.post(shrink2bigger);
}
}
});
private Runnable shrink2bigger = new Runnable(){
@Override
public void run() {
tempNum1+=1;
tempNum2-=1;
shrinkDraw();
Log.i("WatchAnimActivity", "tempNum1 is " + tempNum1);
h.postDelayed(shrink2bigger, 500);
checkTemp(shrink2bigger);
}};
private void shrinkDraw()
{
numLine.setFirstNum(tempNum1);
numLine.setNextNum(tempNum2);
numLine.invalidate();
}
public void checkTemp(Runnable shrink)
{
Log.i("WatchAnimActivity", "tempNum1 in CHeckTemp is " + tempNum1);
if (tempNum1 ==0 || tempNum2==0)
h.removeCallbacks(shrink);
}