今回はViewの限界まで挑戦をしたいと思い、リボンでくるくる回転させてみました。
動作の滑らかさを求めるのであれば、viewよりsurfaceview,surfaceviewよりopenglといわれるのですが、viewのソースコードが割と楽しかったのでその連続で作成してみました。それと最近作った新しいサイトで少しviewを掘り下げたので、ちょっと挑戦をしてみました。
で、できたのがこれです。
まあ、見栄え的には悪くないのかな。と思います。
指を動かすとそのゆびの周りをリボンが回るように、描画していきます。リボンの速度が速くなると、リボンが太くなります。楽しいのですが、使いようがないかも。
作り方↓
マニフェスト
変更なし
レイアウト
main.xmlすらなし
メインクラス
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); DrawLine _dLine = new DrawLine(getApplicationContext()); setContentView(_dLine); }
描画クラス
public class DrawLine extends View { public int _x = 200, _y = 100; public float currentX1 = 200, currentY1 = -100; public float _xV1 = 0,_yV1 = 0; private Handler mHandler = new Handler(); public DrawLine(Context context) { super(context); paint1 = new Paint(); paint1.setColor(Color.rgb(234, 14, 50)); paint1.setAntiAlias(true); paint1.setStrokeWidth(6); paint1.setStrokeCap(Paint.Cap.ROUND); Timer mTimer = new Timer(); mTimer.schedule( new TimerTask(){ @Override public void run() { // mHandlerを通じてUI Threadへ処理をキューイング mHandler.post( new Runnable() { public void run() { invalidate(); } }); } }, 16, 16); } Bitmap _bitmap; Canvas _canvas; Paint paint1; protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); _bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444); _canvas = new Canvas(_bitmap); _canvas.drawColor(Color.WHITE); } protected void onDraw(Canvas canvas) { _xV1 += (_x - currentX1)/12.0f; _yV1 += (_y - currentY1)/12.0f; _xV1 *= 0.92; _yV1 *= 0.92; currentX1 += _xV1; currentY1 += _yV1; paint1.setStrokeWidth(Math.abs(_yV1)/10.0f+Math.abs(_xV1)/10.0f); _canvas.drawLine((int)currentX1, (int)currentY1, (int)(currentX1-_xV1),(int)(currentY1-_yV1), paint1); canvas.drawBitmap(_bitmap, 0, 0, null); } public boolean onTouchEvent(MotionEvent e) { switch (e.getAction()) { case MotionEvent.ACTION_DOWN: _x = (int) e.getX(); _y = (int) e.getY(); break; case MotionEvent.ACTION_MOVE: _x = (int) e.getX(); _y = (int) e.getY(); break; case MotionEvent.ACTION_UP: break; default: break; } return true; } }
フレームレートも30くらい出てる感じですが、もう少しあった方が気持ちよさの面でグレードアップするので残念なんですが、5分くらいはずっとくるくるしてたので、意外に面白いと自分では思っています。
以上です。