почему следующий код не работает? - PullRequest
0 голосов
/ 03 июня 2011

Я пытаюсь создать свой собственный элемент управления, в котором я хочу нарисовать представление, в котором вращается текст. Элемент управления - это в основном круг с текстом. Вот мой класс просмотра:

    package com.helios;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Path.Direction;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;

public class MyGraphicsView extends View {
    int height;
    int width;
    Animation anim;
    Context context;

    public MyGraphicsView(Context context, AttributeSet attrs) {
        super(context);

        this.context = context;
        TypedArray ta = context.obtainStyledAttributes(attrs,
                R.styleable.mygraphicview);
        height = ta.getDimensionPixelSize(R.styleable.mygraphicview_cellHeight,
                1);
        width = ta
                .getDimensionPixelSize(R.styleable.mygraphicview_cellWidth, 1);
    }

    public void startanim(Canvas c) {
        anim = new RotateAnimation(0, 360, height/2, width/2);
        anim.setRepeatMode(Animation.REVERSE);
        anim.setRepeatCount(Animation.INFINITE);
        anim.setInterpolator(new AccelerateInterpolator());
        startAnimation(anim);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(resolveSize(width, widthMeasureSpec),
                resolveSize(height, heightMeasureSpec));
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);
        if (anim == null) {
            startanim(canvas);
        }
        Path circle = new Path();
        circle.addCircle(200, 200, width, Direction.CW);
        Paint canvaspaint = new Paint();
        canvaspaint.setColor(Color.BLUE);
        canvas.drawPath(circle, canvaspaint);
        Paint textpaint = new Paint();
        textpaint.setColor(Color.GREEN);
        canvas.drawTextOnPath("I am rohan Joshi, this is my animation", circle,
                0, 0, textpaint);
    }
}

Вот мой файл main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:mycontrol="http://schemas.android.com/apk/res/com.helios"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:text="@string/hello" />
<com.helios.MyGraphicsView mycontrol:cellWidth="40dip"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    mycontrol:cellHeight="40dip"></com.helios.MyGraphicsView>
</LinearLayout>

Пользовательский вид нигде не отображается. Что я делаю не так?

1 Ответ

1 голос
/ 03 июня 2011

Убедитесь, что в своем методе startanim(Canvas c) вы вызываете anim.setDuration(10000); (с любым значением, которое вам нужно, конечно). Анимация, которую вы сейчас используете, имеет длительность 0, поэтому она технически работает, она просто делает это за 0 секунд, поэтому она мгновенная.

Вы должны также изменить это:

circle.addCircle(width/2, height/2, width / 2.5f, Direction.CW);

Вы создавали окружность со смещением 200 от 0, когда у вас ширина холста 40. Итак, если я прав, вы рисуете это с холста. Это нарисует круг в центре холста.

...