1

これを取り除くためにあらゆる種類のさまざまな方法を試してきたので、うまくいけばこれは簡単なものです.

時計アニメーションを組み込んだAndroidアプリを作っています。非常に面倒なことを除いて、すべてがうまく機能しています。

時計に秒針があり、次のコードを使用して秒針の中心点を中心に回転させています。お気づきかもしれませんが、私はこれをアナログの秒針のように見せようとしているので、ただ時を刻むのではなく、スイープします。

        public float secdegrees, secondwidth, secondheight;

        secondMatrix = new Matrix();
        secondwidth = secondHand.getWidth();
        secondheight = secondHand.getHeight();
        secdegrees = anglepersec * secnow;
        secdegrees += anglepluspermilli * millis;
        secondMatrix.setRotate(secdegrees, secondwidth/2, secondheight / 2);
        newSecond = Bitmap.createBitmap(secondHand, 0, 0,
               (int) secondwidth, (int) secondheight, secondMatrix, true);
        c.drawBitmap(newSecond, (centrex - newSecond.getWidth()/2),
               ((face.getHeight()/2) - newSecond.getHeight()/2), null);

それは実際に私が望む仕事をします...ほとんど。

問題は、中心点の周りで手がわずかに揺れたり揺れたりすることですが、それは非常に目立ち、美学を損ないます.

float 値を丸める方法だと思いますが、誰かが以前にこれを経験し、それを取り除く方法についてアイデアを持っていることを望んでいました.

参考までに、秒針の画像は元は 74 px x 28 px で、(現在) 74 x 74 ピクセルの .png で、秒針の中央が交差点を正確に横切っています。また、75 x 75 にしようとしたので、実際には中央のピクセルもありますが、うまくいきません。

どんな助けでも大歓迎です。

** アップデート

小数が削除された場合に備えてコードを変更しようとしましたが、残念ながらまだうまくいきません。これが私が試して失敗したオプション2です。

        secondMatrix = new Matrix();
        secondwidth = secondHand.getWidth();
        secondheight = secondHand.getHeight();
        secdegrees = anglepersec * secnow;
        secdegrees += anglepluspermilli * millis;
        secondMatrix.setRotate(secdegrees, secondwidth/2, secondheight / 2);
        newSecond = Bitmap.createBitmap(secondHand, 0, 0, (int) secondwidth,
              (int) secondheight, secondMatrix, true);
        float secW = newSecond.getWidth()/2;
        float secH = newSecond.getHeight()/2;

        // NEW CODE HERE
        float calcdeg = secdegrees % 90;
        calcdeg = (float) Math.toRadians(calcdeg);
        float NegY = (float) ((secondwidth*Math.cos(calcdeg)) +
             (secondwidth * Math.sin(calcdeg)));
        c.drawBitmap(newSecond, centrex - NegY/2,
              ((face.getHeight()/2) - NegY/2), null);
4

1 に答える 1

-1

私はあなたの問題を理解しています.mysleftに遭遇したことはありませんが、私にはかなり明白に聞こえます. 回転によって画像の幅と高さが変わるため、不正確さはcentrex - NegX/2

私はテストしていませんが、試してみることをお勧めします:

Matrix matrix=new Matrix()
//first translate to place the center of the hand at Point(0,0)
matrix.setTranslate(-secondWidth/2,-secondHeight/2);
matrix.setRotate(secdegrees);
//now place the pivot Point(0,0) at its expected location
matrix.setTranslate(centreX,centreY);
newSecond = Bitmap.createBitmap(secondHand, 0, 0, secondWidth, secondHeight, matrix, false);
c.drawBitmap(newSecond,0,0,null);

もちろん、これは最適ではありません。newSecond ビットマップは実際に必要なサイズよりもはるかに大きいためです。したがって、centerx と centery が大きい場合は、それよりも小さく変換してから、差の変換で描画することをお勧めします。

//now place the pivot to a position where the hand can be fully drawn without imprecion on the future location of Point(0,0)
matrix.setTranslate(secondWith,secondHeight);
newSecond = Bitmap.createBitmap(secondHand, 0, 0, secondWidth, secondHeight, matrix, false);
c.drawBitmap(newSecond,centrex-secondWidth,centrey-secondHeight,null);

お役に立てれば。

于 2010-12-06T13:42:59.637 に答える