msty開発メモ

技術ネタを綴ります

【Androidプログラミング】タッチ処理でACTION_DOWNしか発生しない時の解決方法

意外とハマる人が多そうな気もするのでメモ書き。

Android Studioで開発していると、インテリセンス機能を使ってメソッドを挿入することが多いと思う。

例えばタッチイベントを処理するメソッド"onTouchEvent"を挿入するとこんな感じのソースが挿入される

@Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }

実はこれが罠なのだ。

Activityクラスを継承したクラスに汚く直接書けば正しく動作するが、
独自に作成したViewクラスを継承したクラスからだと、親クラスのタッチイベントからfalseが帰ってくる。
タッチ中、またがタッチ終了時にもこのメソッドを呼ぶには、このメソッドがtrueを返す必要がある。


つまり戻り値をtrueにすれば解決。
以下のソースで動作確認してみてください

@Override
public boolean onTouchEvent(MotionEvent event) {

    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:
            //タップした瞬間
            Log.d("LOG","Down");
            //ここでfalseを返すと以降のタッチイベントは処理されない
            //return false;
            break;
        case MotionEvent.ACTION_MOVE:
            //タップし続けて座標が変化している間
            Log.d("LOG","Move");
            break;
        case MotionEvent.ACTION_UP:
            //タップしていた指が話された瞬間
            Log.d("LOG","Up");
            break;
    }

    return true;
}

ACTION_MOVEなるとfalseにしてもタッチイベントを取得するのでそちらは工夫が必要。

【AndroidStudio】画面の向きを固定する

その中にactivityタグがあるので、以下の属性を追加する

android:screenOrientation="portrait"

この属性は画面の回転をどうするかを設定する属性で主に使う値は以下の3つ

意味
portrait 縦向き固定
landscape 横向き固定
unspecified 固定しない

以上!

【Go】mapからキーを削除する方法

参考書どおりに書いたら動かなかったのでメモ

f:id:mstybird:20160521171905p:plain

この問題に詰まってここに来た人はこんな感じのコードを書いたんじゃないでしょうか

package main
import "fmt"
func main(){
    m:=make(map[string]int)
    m["id"]=100
    fmt.Printf("%v\n",m)
    //idを消す
    m["id"]=0,false //しかしコンパイルエラー
}    

調べてみたところこのような記事がありました
stackoverflow.com


要約すると、あの書き方は昔のgo言語で使える方法だったけど、今は使えないよ!別の方法を使ってね!ということです。

答えは以下の書き方です

delete(m,"id")

従来の書き方では必ずfalseを渡していたほか、新しく値を代入したところでそのキーは無効化されているため、謎が多い書き方だったみたいです。
delete関数は戻り値を持たないのでキーの削除が成功したかどうかの結果はわかりませんが、
削除後、そのキーが存在するか調べれば消せたかわかります

package main
import "fmt"
func main(){
    m:=make(map[string]int)
    m["id"]=100
    fmt.Printf("%v\n",m)
    _,ok:=m["id"]
    //idキーが存在することを確認
    fmt.Printf("%v\n",ok)
    //idキーを削除
    delete(m,"id")
    //idキーが存在するか確認
    _,ok=m["id"]
    //存在しないので結果はfalse
    fmt.Printf("%v\n",ok)

}    
map[id:100]
true
false

もっと英語頑張らないとね。
Google翻訳を手放せるようになりたい

Android Studio2.x 上部バーとタイトルの両方を消す方法

AppCompatActivityってなんでしょう。
いつもActivityに書き換えてます。

f:id:mstybird:20160521112928p:plain

フルスクリーン化をしてみる

不完全なフルスクリーン化をしてみます。
プロジェクトは「Empty Activity」と仮定

package com.example.msty.drawsample1;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

これに以下の行を「setContextView」より前に呼び出す

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

これでフルスクリーンフラグを与えてさくっとフルスクリーン化...とはいきません。
まだタイトルバーが残ってますよね。

タイトルバーを消す

実はタイトルバーだけを非表示にするフラグの設定もあるのですが今の状態では機能しません。

タイトルバーも消すには継承するクラスを「Activity」に変更します。

public class MainActivity extends Activity {

こんな感じ。
これでタイトルバーも上部バーも消せます。

タイトルバーだけ消したい場合はこの過去記事読んでね。
msty.hatenablog.jp

Android Studio2.xでタイトルバーを非表示にする方法

ゲーム作るために非表示にする必要があったのでメモ書き
f:id:mstybird:20160521002734p:plain

Android Studio2.xではプロジェクトを作成した直後はタイトルバーが表示される。

じゃあ早速タイトルバーを消していこう

今回サンプルで使用しているのは「Empty Activity」
理由はシンプルで何もないから
デフォルトの設定でプロジェクトを作成したならばこんな感じのソースが出来上がると思う

package com.example.msty.notitleproject;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

これは「AppCompatActivity」を継承しているクラスだが、
継承するクラスを「Activity」に変更

すると必要なパッケージがインポートされてないよ!と怒られるので「Alt+Enter」でインポート文の追加

そして、「setContentView」メソッドが呼ばれるより前に、以下の一行を追加する。

requestWindowFeature(Window.FEATURE_NO_TITLE);

このコードを入力中にもう一行インポート文が増えるが、説明は割愛。

これだけでタイトルバーが表示されなくなります。

一応完成品ソース貼っときます。

package com.example.msty.notitleproject;

import android.app.Activity;
//これはコメントアウトしてオーケー
//import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Window;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
    }
}

Windows10にRuby on Rails環境を構築する

過去に少し苦戦したのでメモ

Rubyのインストール

http://rubyinstaller.org/downloadsからRuby2.1.xをインストール
※2.2.xではWindowsだと環境が作れなかったので必ず2.1系にする

同ページにあるDEVELOPMENT KITもダウンロード&解凍。
この際32bit/64bitどちらかに統一すること。

インストールするとパスは通っているが、エクスプローラからコマンドプロンプトを開いた場合、パスの更新が反映されていないので再起動すると楽

rubyのパスを通せたら、解凍したDEVELOPMENT KITのフォルダでコマンドプロンプトを開く
そして次の二つのコマンドを打ち込む

dk.rb init
dk.rb install

これでRubyの開発環境完成

Node.jsのインストール

これがないとサーバ起動ができない環境もあるようなのでhttps://nodejs.org/en/からインストール

Ruby On Railsのインストール

以下のコマンドを実行

gem install rails
gem uninstall bundler
gem install bundler

bundlerを一度アンインストールしているのはバージョン変更のため

ここまで来ればRails環境は完成

サンプルアプリケーションの作成

ちゃんと構築できたかチェックする
あくまで環境構築解説の記事なのでコマンドの説明は割愛

mkdir app
cd app
rails new sample --skip-bundle
cd sample
bundle install

最後のbundle installでエラーが出た場合、sampleフォルダにあるGemfileという名前のファイルをテキストエディタで開いて、以下の行を変更する

変更前

# gem 'therubyracer', platforms: :ruby

変更後

gem 'therubyracer', platforms: :ruby

サーバの起動

以下のコマンドを実行
カレントディレクトリはsampleフォルダであること

rails s

ブラウザでlocalhost:3000と入力してページが表示されれば成功。

お疲れ様でした