1

基本的にグラデーションを使用してレイアウトの背景を更新するカラーフェーダーを作成しようとしているので、以下が私の主な活動です

MainActivity.java


public class MainActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    Thread thread;
    Button btnColor;
    View layout;
    Timer updateTimer;
    int red,green,blue;
    boolean flag=true;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnColor=(Button)findViewById(R.id.btnColor);
        btnColor.setOnClickListener(this);
        layout = findViewById(R.id.lOut);
        updateTimer=new Timer();
        red=green=blue=0;
    }

    @Override
    protected void onStop() 
    {
        super.onStop();
        updateTimer.purge();
    }

    public void changeBackground()
    {
        int colors[]=new int[2];
        if(red==255)
        {
            red=green=blue=0;
        }   
        colors[0]=Color.rgb(red, green, blue);
        colors[1]=Color.rgb(++red, ++green, ++blue);
        GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,colors);
        gd.setCornerRadius(0f);
        layout.setBackgroundDrawable(gd);
    }

    private class UpdateTask extends TimerTask
    {
        Handler handler;
        MainActivity ref;
        public UpdateTask(Handler handler,MainActivity ref)
        {
            super();
            this.handler=handler;
            this.ref=ref;
        }

        @Override
        public void run() 
        {
            handler.post(new Runnable() {

                @Override
                public void run() 
                {
                    ref.changeBackground();
                }
            });

        }

    }

    @Override
    public void onClick(View v) 
    {
        if(v.getId()==R.id.btnColor)
        {
            String text=btnColor.getText().toString();
            if(text.equalsIgnoreCase("start"))
            {
                updateTimer.schedule(new UpdateTask(new Handler(), this), 200, 500);// =new UpdateTask(new Handler(),this);
                btnColor.setText("stop");
            }   
            else
            {
                btnColor.setText("start");
                updateTimer.cancel();
                updateTimer.purge();
            }
        }
    }

}

問題は、UI が正常に更新されていないことです。コードをデバッグすると、背景が変更されたメソッドに到達しますが、UI に変更が見られません。

私は何が欠けていますか?

PS: この動画を参考にしています

LogCat ログ:

02-15 05:14:37.421: ERROR/AndroidRuntime(419): java.lang.IllegalStateException: Timer was cancelled
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at java.util.Timer.scheduleImpl(Timer.java:566)
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at java.util.Timer.schedule(Timer.java:485)
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at com.android.gradient.MainActivity.onClick(MainActivity.java:91)
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at android.view.View.performClick(View.java:2408)
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at android.view.View$PerformClick.run(View.java:8816)
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at android.os.Handler.handleCallback(Handler.java:587)
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at android.os.Looper.loop(Looper.java:123)
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at android.app.ActivityThread.main(ActivityThread.java:4627)
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at java.lang.reflect.Method.invokeNative(Native Method)
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at java.lang.reflect.Method.invoke(Method.java:521)
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-15 05:14:37.421: ERROR/AndroidRuntime(419):     at dalvik.system.NativeStart.main(Native Method)
4

0 に答える 0