Mark and Romain,
Thanks.  That was a much prompter response than I either expected or
deserved.
Romain, I am not sure that I totally understand what you've said.  How
am I to set the background in accordance with the state of isChecked
and isIlluminated from within onDraw if not by calling
setBackgroundResource()?  I guess this post probably belongs in the
Android Beginner's group.
Thanks,
Nick Zaillian

On Aug 30, 2:59 pm, Romain Guy <[email protected]> wrote:
> Do not call setBacgroundResource() in onDraw()! You are loading and
> setting an image every time your view is drawn. You are actually
> creating a infinite "loop";
>
> onDraw() -> setBacgroundResource() -> invalidate() -> onDraw() ->
> setBacgroundResource() -> etc.
>
>
>
> On Sun, Aug 30, 2009 at 11:47 AM, Nick_Zaillian<[email protected]> wrote:
>
> > Hey all,
> > I am writing an app that emulates a drum machine with a step
> > sequencer.  For those unfamiliar with step sequencers, a step
> > sequencer is basically a set of switches where the state of each
> > switch indicates whether or not a sound is to be played at a
> > particular point in a pattern.  I've already got audio playback
> > working using SoundPool and can play patterns (represented as objects
> > containing boolean arrays mapped to audio resources) by stepping
> > through these patterns using a timer.  What I am trying and struggling
> > to do at present is to write my UI.  I have subclassed ToggleSwitch
> > and made a custom switch called SeqSwitch which, in addition to
> > ToggleSwitch's isChecked field, also holds an isIlluminated field.
> > I've written another class called SwitchController that takes an array
> > of these switches and has a method (which I've called runSwitches)
> > that, with each call, advances one switch, illuminates the current
> > switch, and unilluminates the previous switch (the idea is that, when
> > the user plays his pattern, the button representing the current step
> > will illuminate, letting him know the current position of playback in
> > the sequence).  The SeqSwitches seem to render and behave fine in
> > response to clicks.  My SwitchController.runSwitches method also works
> > so long as I place it in a click handler of a button in my main
> > Activity.  When, however, I pass it into the runnable (called
> > PatternPlayTask) that I give to my Timer (which then calls
> > SwitchController.runSwitches every 300 milliseconds as it steps
> > through the pattern), it stops working.  I have used the debugger to
> > make sure that the object I am passing into the runnable is the same
> > as the one for which the call to SwitchController.runSwitches was
> > working in the main activity and have found that definitely it is.
> > Does anybody have any idea what's going on here.  Hopefully I am just
> > doing something totally stupid, here.  I've pasted the code for my
> > ToggleButton subclass below, if that helps:
>
> > package com.drummachine;
> > import android.widget.*;
> > import android.view.*;
> > import android.content.Context;
> > import com.drummachine.Instrument;
> > import android.util.*;
> > import android.content.res.TypedArray;
> > import android.graphics.Canvas;
> > import android.graphics.Paint;
> > import android.graphics.drawable.*;
> > import android.util.AttributeSet;
> > import android.view.View;
>
> > public class SeqSwitch extends ToggleButton {
>
> >        //SeqSwitch holds an isIlluminated state.
> >        //if isIlluminated is true, onDraw will render an illuminated
> >        //button image as the SeqSwitch's drawable (currently the same image
> > used for
> >        //a ToggleButton whose isChecked == true)
> >        public boolean isIlluminated;
>
> >        public SeqSwitch(Context context)
> >        {
> >                super(context);
> >                isIlluminated = false;
>
> >        }
>
> >        //constructor called when params are taken from XML layout
> >    public SeqSwitch(Context context, AttributeSet attributes) {
> >        super(context, attributes);
>
> >        TypedArray a = context.obtainStyledAttributes(attributes,
> >                R.styleable.SeqSwitch);
>
> >       isIlluminated = false;
> >       super.setBackgroundResource
> > (R.drawable.seqswitchbackgroundsoneoff);
>
> >        a.recycle();
> >    }
>
> >    public void setIlluminated(boolean state)
> >    {
> >        isIlluminated = state;
> >        this.invalidate();
>
> >    }
>
> >    //yes, I know having illumniate() and unIlluminate() methods is
> > redundant
> >    //when I have a setIlluminated(boolean) method, but I am presently
> > too lazy
> >    //to rearrange code elsewhere that presently relies on these two
> > methods.
> >    public void unIlluminate()
> >    {
> >        isIlluminated = false;
> >        this.invalidate();
> >    }
>
> >    public void illuminate()
> >    {
> >        isIlluminated = true;
> >        this.invalidate();
> >    }
>
> >    public boolean switchIsIlluminated()
> >    {
> >        return isIlluminated;
> >    }
>
> >    /**
> >     * renders a image of a switch with an illuminated LED if either
> > the SeqSwitch's isChecked or
> >     * isIllumniated == true.  Otherwise it renders a drawable of a
> > button with an unIlluminated LED
> >     */
> >    public void onDraw(Canvas canvas)
> >    {
> >        if(super.isChecked() == true || this.isIlluminated == true)
> >        {
> >                super.setBackgroundResource
> > (R.drawable.seqswitchbackgroundsoneonon);
> >        }
> >        else
> >        {
> >                super.setBackgroundResource
> > (R.drawable.seqswitchbackgroundsoneoff);
> >        }
>
> >    }
> > }
>
> > Thanks,
> > Nick Zaillian
>
> --
> Romain Guy
> Android framework engineer
> [email protected]
>
> Note: please don't send private questions to me, as I don't have time
> to provide private support.  All such questions should be posted on
> public forums, where I and others can see and answer them
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to