カテゴリー
Android Java RxJava

RxJavaを学ぶ(その3)

バックグラウンド・スレッドからメインスレッドにタスクを返したい場合は、subscribe()の前段にobserveOn(AndroidSchedulers.mainThread())を挿入する。これでバックグラウンド・タスクの結果によるUIのアップデートが可能。

下記はCompositeDisposableにdisposeを任せる例も兼ねて書いてみた。

Disposable isCountingDownDisposable = playMidi.isCountingDownSubject.observeOn(AndroidSchedulers.mainThread()).subscribe(value -> {
      if (value) {
        playButton.setImageResource(R.drawable.ic_round_loop_24);
        playButton.setPadding(10,10,10,10);
      } else {
        playButton.setImageResource(R.drawable.ic_play_fill);
        playButton.setPadding(-20,-20,-20,-20);
      }
    });
compositeDisposable.add(isCountingDownDisposable);
カテゴリー
Android Java

カスタムTouch Controlを作ってみた

スクリーン上で指を上下させることで値を増減させられるコントローラーを書いてみました。

private class OnAreaTouched implements View.OnTouchListener {

    double initialY = 0.0;
    double previousY = 0.0;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
      switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN:
          initialY = event.getY();
          break;
        case MotionEvent.ACTION_MOVE:
          double currentY = event.getY();
          // if finger initially went upwards, then changed it's direction to downwards
          if(currentY < initialY && currentY > previousY) {
            initialY = previousY;
          }
          // if finger initially went downwards, then changed it's direction to upwards
          if(currentY > initialY && currentY < previousY) {
            initialY = previousY;
          }
          double diff = (initialY - currentY) / 100;
          Log.d("MyTest", "initial: " + initialY + ", getY(): " + event.getY() + ", diff: " + diff);
          mValue = mValue + diff;
          // upper bound 400, lower bound 20
          mValue = Math.max(Math.min(mValue, 400), 20);
          String mValueString = "" + (int)mValue;
          SpannableString mValueSpanString = new SpannableString(mValueString);
          mValueSpanString.setSpan(new StyleSpan(Typeface.BOLD), 0, mValueSpanString.length(), 0);
          mValueTV.setText(mValueSpanString);
          previousY = event.getY();
          break;
        default:
          break;
      }
      return true;
    }
}
カテゴリー
Android Java

RelativeLayoutでViewをCenterに配置

public class MainActivity extends AppCompatActivity {

  BackgroundService bs;

  Button button1;
  Button button2;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    RelativeLayout rootLayout = new RelativeLayout(this);
    setContentView(rootLayout);

    bs = BackgroundService.getInstance();

    button1 = new Button(this);
    button1.setText("Task1");
    int button1Id = View.generateViewId();
    button1.setId(button1Id);
    RelativeLayout.LayoutParams buttonLP1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    buttonLP1.addRule(RelativeLayout.CENTER_IN_PARENT);
    button1.setLayoutParams(buttonLP1);
    button1.setOnClickListener(new OnButtonClicked());

    rootLayout.addView(button1);

    button2 = new Button(this);
    button2.setText("Task2");
    RelativeLayout.LayoutParams buttonLP2 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    buttonLP2.addRule(RelativeLayout.BELOW, button1Id);
    buttonLP2.addRule(RelativeLayout.CENTER_HORIZONTAL);
    buttonLP2.topMargin = 20;
    button2.setLayoutParams(buttonLP2);

    rootLayout.addView(button2);
  }

  private class OnButtonClicked implements View.OnClickListener {

    @Override
    public void onClick(View v) {
      bs.backgroundTask1();
    }
  }

  private class OnButton2Clicked implements View.OnClickListener {

    @Override
    public void onClick(View view) {
      bs.backgroundTask2();
    }
  }
}
カテゴリー
Android Java

ClassをSingletonにするには

public class BackgroundService {
  
  public static BackgroundService getInstance() { return SingletonHolder.INSTANCE; }
  private static class SingletonHolder { private static final BackgroundService INSTANCE = new BackgroundService(); }
  private BackgroundService() {}

}
カテゴリー
Android Java RxJava

RxJavaを学ぶ(その2)

値を代入すると、Subscriberで何か処理がトリガーされるようなコード

Subject<Integer> intSubject = PublishSubject.create();
intSubject.subscribe(i -> Log.d(TAG, "Logging: " + i));


private class onButtonClicked implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        intSubject.onNext(17);
    }
}

// when the button is clicked, Logs out "Logging: 17"
カテゴリー
Android Java RxJava

RxJavaを学ぶ(その1)

全体像を掴むために、このビデオは分かりやすくていいと思います!

まずは、最小構成

Observable<String> myObservable = Observable.just("Some new string", "Some other String", "Another");
// "s" is a subscribed string, and logging it when received in onNext
myObservable.subscribe(s -> Log.d(TAG, "Logging: " + s));

Observerを設定し、処理を記述することもできる

myObserver = new Observer<String>() {
      @Override
      public void onSubscribe(@NonNull Disposable d) {
        Log.i(TAG, "onSubscribe invoked");
      }

      @Override
      public void onNext(@NonNull String s) {
        Log.i(TAG, "onNext invoked");
        Log.i(TAG, "Logging " + s);
      }

      @Override
      public void onError(@NonNull Throwable e) {
        Log.i(TAG, "onError invoked");
      }

      @Override
      public void onComplete() {
        Log.i(TAG, "onComplete invoked");
      }
};

myObservable.subscribe(myObserver);
カテゴリー
JavaScript PHP

PHP変数をJavaScriptで扱うには(そしてその逆も)

一旦Dom Elementに値を保持させて、その後JavaScriptでその値をゲットする方法が良さそう。このリンク

カテゴリー
Linux

Digitalocean Dropletにnon rootユーザーでSSHアクセス

この記事

カテゴリー
PHP

AWSにLEMP環境を構築する

この手順を参考に設定をする

Laravelの導入はこの手順

laravelプロジェクトをgithubからcloneしたら、以下を実施し、APP_DEYを生成する。

composer update
カテゴリー
iOS Swift

Custom UIViewの最小テンプレート

class CustomUIView: UIView {	
  init() {
    super.init(frame: .zero)
    // any initialization comes here...
  }	
  required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }	
}