将动态元素绘制到普通的xml布局上

时间:2011-08-23 03:49:55

标签: android

我一直试图解决这个问题一段时间......我需要在seekBar的顶部放置标记,以显示用户过去收藏的位置。数据存储在xml中。问题是让小椭圆出现在seekBar上......它只是不起作用......

这是我的代码:

public class seekMark extends View {
    private int     seekLength;     // in pixels 
    private int     seekLeftPad;    // in pixels
    private int     seekBottomPad;  // in pixels
    private int     trackLength;    // in ms
    private float   pxOverMs;       // in px/ms
    ShapeDrawable   lmark;
    private seekMark instance;

    public seekMark(Context context){
        super(context);
        instance = this;
        seekLength = progressBar.getWidth();
        seekLeftPad = progressBar.getPaddingLeft();
        seekBottomPad = progressBar.getBottom();
        trackLength = player.getDuration();
        pxOverMs = pxPerMs();
        lmark = new ShapeDrawable(new OvalShape());
    }

    private float pxPerMs(){
        return ((float) seekLength)/((float) trackLength);
    }

    private int[] markPxList() throws XmlPullParserException, IOException {

        int bmStartTime = 0;
        String bmNames[] = bmNameList(xmlPath);
        int[] bmPos = new int[bmNames.length];

        for(int i=0; i < bmNames.length; i++){
            bmStartTime = getBookmark(xmlPath, bmNames[i]);
            bmPos[i] =  (int) (bmStartTime * pxOverMs);
        }
        return (bmPos);
    }

    public void markPlace() throws XmlPullParserException, IOException {

        int y = seekBottomPad;
        int x = 0;
        int bmPos[] = markPxList();

        for(int i = 0; i < bmPos.length; i++){
            x = bmPos[i] + seekLeftPad;
            lmark = new ShapeDrawable();
            lmark.getPaint().setColor(0xff74AC23);
            lmark.setBounds(x, y, x + 1, y + 1);
            instance.invalidate();
        }

    }
    protected void onDraw(Canvas canvas) {
        lmark.draw(canvas);
    }

}

使用此代码从onCreate调用它。我在另一个线程中使用它来避免在onCreate中尚未设置progressBar维度的问题。

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

    if (display.getRotation() == 1){   // if landscape

        final Runnable runner = new Runnable() {
            public void run() {
                seekMark seekMarks = new seekMark(context);

                try {
                    seekMarks.markPlace();
                } catch (XmlPullParserException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // runs in another thread to avoid the problem with calling
                // seekMark directly from onCreate
            }
        };
        handler.postDelayed(runner, 1000);

    }

每当我尝试调用seekMark.markPlace()时,程序都会崩溃...我试图在我的布局main.xml上绘制它。

1 个答案:

答案 0 :(得分:0)

我不确定这是不是你想要做的。

Customize Seekbar

这种方法似乎相似,但方法不同。