2014年11月19日水曜日

【アプリ開発】ライブラリ導入-JazzyViewPager

今回新しいアプリを作成中で、そのアプリに新規にライブラリを導入してみましたので紹介していきます(^o^)/

ページを左右にフリックする際に様々なエフェクトを追加できるライブラリです。


JazzyViewPager


ページ切替の際に色々と効果を入れてみたいと思っていましたが手を出せずにいましたので、
まずはライブラリで試していきたいと思います(^^ゞ

エフェクト一覧(TrasitionEffect)

全部で12種類あるようです。
設定でそれぞれ切り替えれるようにしてみましたので、それぞれのイメージも載せていきます。
  1. Standard
  2. Tablet
  3. CubeIn
  4. CubeOut
  5. FlipVertical
  6. FlipHorizontal
  7. Stack
  8. ZoomIn
  9. ZoomOut
  10. RotateUp
  11. RotateDown
  12. Accordion


1.Standard

一般的なフリックでのページ切替動作になります。
普通にどのアプリでもみかける動作ですね。



2.Tablet

タブレットでみられるページ切替動作のようです。
タブレット自体あまり操作していませんが、実際はこうゆう動作をしているんでしょうね(^^;



3.CubeIn


手前側を中心にページが回転するようなページ切替動作になります。
3Dダンジョンなんかで視点が回転するようなイメージでしょうか(´・ω・`)



4.CubeOut

奥側を中心にページが回転するようなページ切替動作になります。
両方のページを見ることができるので、両方のページを確認したいときなんかに便利そうです♪




2014年11月6日木曜日

【アプリ開発】Fragmentまとめ

Fragmentについてまとめていきます(^^ゞ



注意事項

・Fragment内でActivity側のメンバ変数やメソッドを呼び出してはいけない
 → 呼び出す場合はonAttach時に行う
 → instansofで型チェックは行うべき
 → コールバック関数を使用する
・画面を回転させると引数なしのデフォルトコンストラクタで再生成される

ライフサイクル



Fragment内の変数を保存、呼出方法


    //////////////////////////////////
    @Override
    public void onSaveInstanceState(final Bundle outState)
    {
        super.onSaveInstanceState(outState);
        outState.putInt("KEY_FRAGMENT_ID", mListID);
        outState.putString("KEY_FRAGMENT_SITENAMES", mSiteNameS);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);

        if (savedInstanceState != null)
        {
            mListID = savedInstanceState.getInt("KEY_FRAGMENT_ID");
            mSiteNameS = savedInstanceState.getString("KEY_FRAGMENT_SITENAMES");
        }
    }
    //////////////////////////////////


Fragmentのサブクラス

DialogFragment
ListFragment
PreferenceFragment
WebViewFragment

【アプリ開発】ActionBarに関するTips

ActionBarに関してTips集としてここに書き込んでいきます。
気づいた時点で更新していきます(・∀・)


タイトルバーを隠す

    //////////////////////////////////
    final ActionBar actionBar = getActionBar();

    // タイトルバーを消去
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayShowHomeEnabled(false);
    //////////////////////////////////


2014年11月2日日曜日

【アプリ開発】RSS取得

2ちゃんまとめ閲覧用アプリを作る機会があったため、
RSSの取得のあたりについて書きたいと思います(^O^)



RSS情報アイテムクラス

以下はRSSで取得した情報を保存するクラスです。


import android.os.Parcel;
import android.os.Parcelable;


/***********************************************************************
 * RSS情報アイテムクラス
 ***********************************************************************/
public class RssItem implements Parcelable
{
 // 記事のサイト名
 private CharSequence mSiteName;
 // 記事のタイトル
 private CharSequence mTitle;
 // 記事の日付
 private CharSequence mDate;
 // 記事のリンク
 private CharSequence mLink;
 // 記事のカテゴリ
 private CharSequence mCategory;

 // コンストラクタ
 public RssItem() 
 {
  mSiteName = "";
  mTitle = "";
  mDate = "";
  mLink = "";
  mCategory = "";
 }
 private RssItem(Parcel in)
 {
         mSiteName = in.readString();
         mTitle = in.readString();
         mDate = in.readString();
         mLink = in.readString();
         mCategory = in.readString();
 }

 /***********************************************************************
  * 日付の取得・セット
  ***********************************************************************/
 public CharSequence getDate() {
  return mDate;
 }
 public void setDate(CharSequence date) {
  mDate = date;
 }

 /***********************************************************************
  * タイトルの取得・セット
  ***********************************************************************/
 public CharSequence getTitle() {
  return mTitle;
 }
 public void setTitle(CharSequence title) {
  mTitle = title;
 }

 /***********************************************************************
  * サイト名の取得・セット
  ***********************************************************************/
 public CharSequence getSiteName() {
  return mSiteName;
 }
 public void setSiteName(CharSequence name) {
  mSiteName = name;
 }

 /***********************************************************************
  * リンクの取得・セット
  ***********************************************************************/
 public CharSequence getLink() {
  return mLink;
 }
 public void setLink(CharSequence link) {
  mLink = link;
 }

 /***********************************************************************
  * カテゴリの取得・セット
  ***********************************************************************/
 public CharSequence getCategory() {
  return mCategory;
 }
 public void setCategory(CharSequence category) {
  mCategory = category;
 }

 @Override
 public int describeContents()
 {
  return 0;
 }

 @Override
 public void writeToParcel(Parcel out, int flags)
 {
         out.writeString(mSiteName.toString());
         out.writeString(mTitle.toString());
         out.writeString(mDate.toString());
         out.writeString(mLink.toString());
         out.writeString(mCategory.toString());
 }

 public static final Parcelable.Creator CREATOR
  = new Parcelable.Creator()
 {
  public RssItem createFromParcel(Parcel in) 
  {
      return new RssItem(in);
  }

  public RssItem[] newArray(int size) 
  {
      return new RssItem[size];
  }
 };
}



RSS情報アイテム取得処理

以下はRSSを読み取ってRSS情報アイテムクラスにセットしている処理です。 

 // 判定用
 boolean IsItemTag(String tag){ return (tag.equals("entry") || tag.equals("item")); }
 boolean IsTitleTag(String tag){ return tag.equals("title"); }
 boolean IsDateTag(String tag){ return (tag.equals("issued") || tag.equals("date")); }
 boolean IsLinkTag(String tag){ return tag.equals("link"); }
 boolean IsSubjectTag(String tag){ return tag.equals("subject"); }

 /*******************************************************************************
  * XMLをパースする
  *
  * @param InputStream  is  : XMLテキスト
  *******************************************************************************/
 public void parseXml(InputStream is) throws IOException, XmlPullParserException
 {
  // パーサー準備
  XmlPullParser parser = Xml.newPullParser();
  try
  {
   parser.setInput(is, null);
   int eventType = parser.getEventType();
   RssItem currentItem = null;
   while (eventType != XmlPullParser.END_DOCUMENT)
   {
    String tag = null;
    switch (eventType)
    {
    // 開始タグの判定
    case XmlPullParser.START_TAG:
     tag = parser.getName();
     if (IsItemTag(tag))
     {
      // <item><entry>の場合、RssItemクラス生成
      currentItem = new RssItem();
     }
     else if (currentItem != null)
     {
      if (IsTitleTag(tag))
      {
       // <title>の場合、タイトルセット
       currentItem.setTitle(parser.nextText());
      }
      else if (IsDateTag(tag))
      {
       // <issued><date>の場合、日付セット
       currentItem.setDate(parser.nextText());
      }
      else if(IsLinkTag(tag))
      {
       // <link>の場合、リンク先のURLをセット
       String strLink = "";
       for(int i=0; i<parser.getAttributeCount(); i++)
       {
        if(parser.getAttributeName(i).equals("href"))
        {
         strLink = parser.getAttributeValue(i);
        }
           }
       if(strLink.equals(""))
       {
        strLink = parser.nextText();
       }
       currentItem.setLink(strLink);
      }
      else if(IsSubjectTag(tag))
      {
       // <subject>の場合、題名セット
       currentItem.setCategory(parser.nextText());
      }
     }
     break;
    // 終了タグの判定
    case XmlPullParser.END_TAG:
     tag = parser.getName();
     if (IsItemTag(tag))
     {
      :
     }
     break;
    }
    // 次のタグを取得
    eventType = parser.next();
   }
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }
 }






実際2ちゃんのアプリに組み込んで使用しています。
友人から提案してもらったアイディアで作成したアプリで友人の方でアプリを公開していたのですが、
現在はアプリ停止されています(・_・;)


Googleは急にアプリ停止されたり、アカウント停止される危険性があるのでこわいところですね(´・ω・`)

2014年9月7日日曜日

【アプリ開発】画像ファイルなしで背景画像を作る③

以前の記事
【アプリ開発】画像ファイルなしで背景画像を作る①
【アプリ開発】画像ファイルなしで背景画像を作る②
で、プログラムで背景を描画するサンプルアプリを紹介しました。

今回も第3弾として背景の描画を4つ追加してアプリを更新しました(^0^)/

前回同様、今回もその背景のサンプルコードとスクリーンショットを載せていきます(´・ω・`)
画像の容量を節約しつつクールな背景画像として利用できればと思いますので、
参考にオリジナルの背景としてアプリにご利用いただければうれしいです☆


アプリ


















まずは、再度サンプルアプリを紹介します。
今回紹介する背景も追加してアップデート済みですので、まずはお試しください(^0^)/♪



背景パターン(今回追加分)

前回までの10の背景パターンに加えて、以下の4つの背景パターンをアプリに追加しました。
今回は多少実用的な背景ができたので、テーマをつけて紹介します。

□雨あと
 ・多数の線と円の模様(2色、半透明)

□四角模様(左下)
 ・多数の四角形をちりばめた模様(2色、半透明)  

□四角模様(上下)
 ・多数の四角形をちりばめた模様(カラフル、半透明)

□四角模様(真ん中)
 ・多数の四角形をちりばめた模様(1色、半透明)  



雨あと




雨が降って波紋が広がるような画の背景です。

まず線をランダムに描画して、2色の円を右下の方に描画しています。
ランダムに取得したX座標とY座標が左上の座標(0,0)の半径240pxの円の範囲内に入らないようにして描画しています。


 // 線と円の描画
 public void DrawBackground011(Canvas csCanvas)
 {
  Random rand = new Random();

  Paint csPaint = new Paint();
  csPaint.setAntiAlias(true);
  csPaint.setColor(Color.argb(128+rand.nextInt(80),rand.nextInt(256),rand.nextInt(256),rand.nextInt(256)));

  RectF sOval = new RectF();
  for(int x=0; x<=320; x+=20)
  {
   if(x==160) csPaint.setColor(Color.argb(128+rand.nextInt(80),rand.nextInt(256),rand.nextInt(256),rand.nextInt(256)));
   for(int y=0; y<=320; y+=80)
   {
    int nX = 0, nY = 0;
    boolean bLoop=true;
    while(bLoop)
    {
     nX = rand.nextInt(320);
     nY = rand.nextInt(320);
     if(240 < Math.sqrt(nX*nX+nY*nY)) bLoop = false;
    }
    int nSize = rand.nextInt(30)+10;
    sOval.set(nX, nY, nX+nSize, nY+nSize);
    csCanvas.drawOval(sOval, csPaint);
   }
   int nX = rand.nextInt(320);
   int nY = rand.nextInt(320);
   int nSize = rand.nextInt(40);
   csCanvas.drawLine(nX, nY, nX+nSize, nY+nSize, csPaint);

  }

 }


2014年8月15日金曜日

【アプリ開発】画像ファイルなしで背景画像を作る②

以前の記事「【アプリ開発】画像ファイルなしで背景画像を作る①」で、プログラムで背景を描画するサンプルアプリを紹介しましたが、
そのアプリを更新して今回、背景の描画を3つ追加しました(^0^)/

前回同様、今回もその背景のサンプルコードとスクリーンショットを載せていきます(´・ω・`)
画像の容量を節約しつつクールな背景画像として利用できればと思いますので、
参考にオリジナルの背景としてアプリにご利用いただければうれしいです☆

アプリ


















まずは、再度サンプルアプリを紹介します。
今回紹介する背景も追加してアップデート済みですので、まずはお試しください(^0^)/♪



背景パターン(今回追加分)

前回の7つの背景パターンに加えて、以下の3つの背景パターンをアプリに追加しました。

 ・四角形の幾何学模様(モノクロ)
 ・多数の四角形の幾何学模様(モノクロ)  
 ・多数の線と円の統一色の模様(1色、半透明)





四角形の幾何学模様



背景名の命名は適当にそれっぽい名前をつけていますので、良い名前があればコメントください(^^;
四角形を90度回転させながら段々小さく描画していきました。
色は交互に白黒で変化させています。
 // 四角形の幾何学模様
 public void DrawBackground008(Canvas csCanvas)
 {
  Paint csPaint = new Paint();
  csPaint.setAntiAlias(true);
  RectF sRect = new RectF();
  for(int xy=320; xy>0; )
  {
   csPaint.setColor(Color.BLACK);
   sRect.set(160-xy/2, 160-xy/2, 160+xy/2, 160+xy/2);
   csCanvas.drawRect(sRect, csPaint);
   xy/=Math.sqrt(2);
   csCanvas.rotate(45, 160, 160);
   csPaint.setColor(Color.WHITE);
   sRect.set(160-xy/2, 160-xy/2, 160+xy/2, 160+xy/2);
   csCanvas.drawRect(sRect, csPaint);
   xy/=Math.sqrt(2);
   csCanvas.rotate(45, 160, 160);
  }
 }


2014年8月14日木曜日

【アプリ開発】ProgressBarの色

今回プログレスバーの色の設定で少し戸惑ったため処理方法を書き留めておきます。


ProgressBarの色の設定方法

プログレスバーの色を変更して表示するための方法です。

 <!-- 読込中表示プログレスバー -->
 <ProgressBar
         android:id="@+id/loadingProgress"
         style="?android:attr/progressBarStyleHorizontal"
         android:progressDrawable="@drawable/ic_progress_green"
         android:layout_width="match_parent"
         android:layout_height="3dp"/>


<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:id="@android:id/background">
     <shape>
  <corners android:radius="5dip" />
  <gradient
   android:startColor="#000000"
   android:centerColor="#000000"
   android:centerY="0.5"
   android:endColor="#000000"
   android:angle="270"
  />
  </shape>
 </item>
 <item android:id="@android:id/progress">
  <clip>
  <shape>
  <corners android:radius="5dip" />
  <gradient
   android:startColor="@color/holo_green_dark"
   android:centerColor="@color/holo_green_light"
   android:centerY="0.5"
   android:endColor="@color/holo_green_dark"
   android:angle="270"
  />
  </shape>
  </clip>
 </item>
</layer-list>




ProgressBarのアニメーション表示

プログレスバーを読み込み中のようにアニメーション表示するための方法です。


     <!-- 読込中表示プログレスバー -->
     <ProgressBar
         android:id="@+id/loadingProgress"
         android:layout_width="match_parent"
         android:layout_height="3dp"
         android:indeterminateDrawable="@drawable/ic_progress_indeterminate_green" />




<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false" >
    <item android:duration="200">
        <shape android:shape="rectangle" >
            <gradient
                android:angle="180"
                android:centerY="1.0"
                android:endColor="@color/holo_green_dark"
                android:centerColor="@color/holo_green_light"
                android:startColor="@color/holo_green_dark"
                android:type="linear" />
        </shape>
    </item>
    <item android:duration="50">
        <shape android:shape="rectangle" >
            <gradient
                android:angle="180"
                android:centerY="0.8"
                android:endColor="@color/holo_green_dark"
                android:centerColor="@color/holo_green_light"
                android:startColor="@color/holo_green_dark"
                android:type="linear" />
        </shape>
    </item>
    <item android:duration="50">
        <shape android:shape="rectangle" >
            <gradient
                android:angle="180"
                android:centerY="0.6"
                android:endColor="@color/holo_green_dark"
                android:centerColor="@color/holo_green_light"
                android:startColor="@color/holo_green_dark"
                android:type="linear" />
        </shape>
    </item>
    <item android:duration="50">
        <shape android:shape="rectangle" >
            <gradient
                android:angle="180"
                android:centerY="0.4"
                android:endColor="@color/holo_green_dark"
                android:centerColor="@color/holo_green_light"
                android:startColor="@color/holo_green_dark"
                android:type="linear" />
        </shape>
    </item>
    <item android:duration="50">
        <shape android:shape="rectangle" >
            <gradient
                android:angle="180"
                android:centerY="0.2"
                android:endColor="@color/holo_green_dark"
                android:centerColor="@color/holo_green_light"
                android:startColor="@color/holo_green_dark"
                android:type="linear" />
        </shape>
    </item>
    <item android:duration="70">
        <shape android:shape="rectangle" >
            <gradient
                android:angle="180"
                android:centerY="0.0"
                android:endColor="@color/holo_green_dark"
                android:centerColor="@color/holo_green_normal"
                android:startColor="@color/holo_green_dark"
                android:type="linear" />
        </shape>
    </item>

    <item android:duration="100">
        <shape android:shape="rectangle" >
            <gradient
                android:angle="180"
                android:centerY="0.2"
                android:endColor="@color/holo_green_dark"
                android:centerColor="@color/holo_green_normal"
                android:startColor="@color/holo_green_dark"
                android:type="linear" />
        </shape>
    </item>
    <item android:duration="100">
        <shape android:shape="rectangle" >
            <gradient
                android:angle="180"
                android:centerY="0.4"
                android:endColor="@color/holo_green_dark"
                android:centerColor="@color/holo_green_normal"
                android:startColor="@color/holo_green_dark"
                android:type="linear" />
        </shape>
    </item>
    <item android:duration="100">
        <shape android:shape="rectangle" >
            <gradient
                android:angle="180"
                android:centerY="0.6"
                android:endColor="@color/holo_green_dark"
                android:centerColor="@color/holo_green_normal"
                android:startColor="@color/holo_green_dark"
                android:type="linear" />
        </shape>
    </item>
    <item android:duration="100">
        <shape android:shape="rectangle" >
            <gradient
                android:angle="180"
                android:centerY="0.8"
                android:endColor="@color/holo_green_dark"
                android:centerColor="@color/holo_green_normal"
                android:startColor="@color/holo_green_dark"
                android:type="linear" />
        </shape>
    </item>
    <item android:duration="100">
        <shape android:shape="rectangle" >
            <gradient
                android:angle="180"
                android:centerY="1.0"
                android:endColor="@color/holo_green_dark"
                android:centerColor="@color/holo_green_normal"
                android:startColor="@color/holo_green_dark"
                android:type="linear" />
        </shape>
    </item>

</animation-list>

2014年7月16日水曜日

【アプリ開発】TextViewの小ネタ(Tips)

TextViewの便利な設定やちょっとした小技をまとめていきます☆



URLやメールアドレスの自動リンク設定


    // 自動的にリンクを生成するように設定
    TextView csLinkedTextView = new TextView(this);
    csLinkedTextView.setText("URL:http://www.takahara-books.com/Android/");
    csLinkedTextView.setAutoLinkMask(Linkify.ALL);




フォントの指定


    // ビューに表示するフォントを指定
    TextView csFontTextView = new TextView(this);
    csFontTextView.setText("サンプル");
    csFontTextView.setTypeface(Typeface.SERIF, Typeface.BOLD_ITALIC);




自動補完の機能追加


    // 候補に表示される文字列
    String[] strAutoWordlist = new String[]{
        "Cupcake",
        "Cute",
        "Donut",
        "Eclair",
        "Froyo",
        "Gingerbread",
        "Honeycomb",
        "IceCreamSandwich",
        "Kitkat"
    }

    // アダプタを作成
    ArrayAdapter adapterAuto = new ArrayAdapter(
        this,
        android.R.layout.simple_dropdown_item_1line,
        strAutoWordlist
    );

    // AutoCompleteTextViewインスタンスを作成
    AutoCompleteTextView csAutoCompTextView = new AutoCompleteTextView(this);

    // アダプタをセット
    csAutoCompTextView.setAdapter(adapterAuto);




2014年6月13日金曜日

【アプリ活用】DevAppsDirect

icon DevAppsDirect

GitHubなんかで公開されている数多くのライブラリのサンプルを実際にアプリ内でダウンロードして実行できるデモアプリです。全部確認してみましたが、自分のアプリにも取り入れたい物が結構ありましたので、いずれ使っていきたいですね。

動作している端末によっては、デモの内起動できないものもありますが、デモ自体は随時更新されているので、日々新しいライブラリを確認することができてとても便利です☆


今回その中で、簡単に組み込めそうで今後使っていきたいと思っているものを紹介していきます(^O^)/




①PagedDragDropGrid


このライブラリはグリッドで画像等を表示し、アイテムを長押しするとそのアイテムを別な場所に
移動することができます。自動で並び替えをせず、ユーザーが好きに並び順を決めたい場合に
使えるかと思います。

データフォルダでは自動で並び替えているため使いドコロが今のところありませんが、
いずれ新しいアプリででも使用してみたいライブラリです(^^)


対応OS:Android2.2(API 8)以上



②Showcase View




最近色々なアプリでみかけるようになったライブラリですね。
ヘルプやチュートリアルなどで、操作の説明するときなどに使われています。
ボタンを強調してテキストで説明したり、アニメーションによる解説、強調位置を移動させて順々に説明することができます。

使える用途も多いかと思いますし、初回のチュートリアルなんかで丁寧に解説したいときに取り入れていきたいなと思っています。

できれば説明なしに直感で使えるアプリにできることが理想ですけど、
機能を増やすとどうしても説明が必要になってきますしね(^^;



③ArchMenu


画面上には2つのボタンがありますが、左上のボタンをタッチするとボタンからみぎにメニューが飛び出します。
その下のボタンをタッチすると右上にメニューがそれぞれ飛び出してきます。

NEXUS5では解像度の関係でメニューが小さく表示されてしまっているようですが、調整できれば
ビジュアル的にもよさ気なので、ゲーム等のアプリを作った際には試してみたいライブラリです。

色々ライブラリを見つけてて思うのですが、使いドコロを考えるのが難しいですよね(^^;

対応OS:Android 2.0以上

2014年5月28日水曜日

【アプリ開発】アイコンに多言語のテキスト追加

アイコン等の画像を用意するとき、テキスト付きのアイコンを用意する場合があると思います。

以前にも【アプリ開発】画像への描画について書きましたが、今回はボタン用のアイコンに
多言語のテキストを描画してわざわざ多言語用のアイコンを用意せずにアプリで利用しようという
方法になります(^^)

自分もよくテキスト付きのアイコンを使っていたのですが、
日本語以外の言語に対応する場合、他の言語用のアイコンを用意する必要が出てしまい、
とても面倒でした(´・ω・`)

なので、テキストなしのアイコンのみ用意して、
プログラム内で画像にテキストを描画したものをBitmapとして使う方法がとても便利でしたので、
紹介していきます♪




用意するアイコン

最近データフォルダで追加したアイコンになりますが、
データフォルダで複数選択時、画面下に表示するテキスト無しのアイコンになります。


データフォルダでの複数選択時

 


アイコンにテキストを描画してBitmapとして使用しています。
最初に用意したテキスト無しのアイコンだけで他言語用のアイコンを作成できるため、
個別に各言語用のアイコンを用意する必要がありません。




描画処理

以下の関数に読み込んだアイコンのBitmapと書き込みたいテキストを渡して、
テキストの色とサイズを指定すれば、画像の下部にテキストを追加できます。

2014年5月23日金曜日

【WEB】円形プログレス

CSSとJavaScriptとHTMLのコードだけで使えるブログ用のパーツとして使えるものが他にもありましたので、紹介します(^^)

円形のプログレスが上がったり下がったりするアニメーションをしますが、
カスタマイズすれば色々と使えるのではないかと思います。




円形プログレス









参考


というサイトで他にも色々と使ってみたいコードがあります♪

また良い物があれば紹介していきます~(^O^)/

【WEB】計算機


CSSとJavaScriptとHTMLのコードだけで使える計算機を見つけましたので紹介します(^^)
(ブログでちゃんと動くかは未確認ですが(^^;))



計算機




C
7 8 9 + 4 5 6 - 1 2 3 ÷ 0 . = x





参考


というサイトで他にも色々と使ってみたいコードがあります♪
また良い物があれば紹介していきます~(^O^)/

2014年5月9日金曜日

【アプリ開発】CSVファイル読込クラス

CSVファイルを読み込むだけの汎用的なクラスが欲しくて作成しました(^^;


CSVファイル読込クラス


/***************************************************************************
* CSVコントロールクラス
***************************************************************************/
public class CSVCtrl
{
    /***************************************************************************
    * CSVファイルから読み込んだデータリストを取得
    *
    * @param csContext        コンテキスト
    * @param strCsvFileName   CSVファイル名
    * @return 読み込んだCSVデータリスト
    *
    * @author k0j1
    ***************************************************************************/
    static public List ReadCSV(Context csContext, String strCsvFileName)
    {
        InputStream csInputStream = null;
        BufferedReader csBufReader = null;
        List sCsvList = new ArrayList();

        try
        {
            AssetManager csAsset = csContext.getResources().getAssets();
            csInputStream = csAsset.open(strCsvFileName);
            csBufReader = new BufferedReader(new InputStreamReader(csInputStream));

            // タイトル処理
            // タイトルは読み捨てる
            csBufReader.readLine();

            // データ処理
            {
                // 最終行まで読み込む
                for( String line = ""; (line = csBufReader.readLine()) != null; )
                {

                    // 1行をデータの要素に分割
                    StringTokenizer csStringToken = new StringTokenizer(line, ",");

                    // リストに保持
                    sCsvList.add(csStringToken);
                }
                csBufReader.close();
            }

        } catch (FileNotFoundException e) {
            // Fileオブジェクト生成時の例外捕捉
            e.printStackTrace();
        } catch (IOException e) {
            // BufferedReaderオブジェクトのクローズ時の例外捕捉
            e.printStackTrace();
        }

        return sCsvList;
    }
}


上記の関数で以下のような最初の1行がタイトル行であるCSVファイルを処理できます。


❏timetable.csv
番号,50音順(1:あ行、2:か行、…),地域区分,区,愛称,経路区分,経路・時刻表名,URL
1,1,1,荒川区,さくら・汐入さくら,1,運行ルート,http://yamatocreation.cocotte.jp/bus/arakawa/keiro
2,1,1,荒川区,さくら・汐入さくら,2,さくら時刻表,http://yamatocreation.cocotte.jp/bus/arakawa/sakura
3,1,1,荒川区,さくら・汐入さくら,3,汐入さくら時刻表,http://yamatocreation.cocotte.jp/bus/arakawa/sioiri
4,1,1,荒川区,さくら・汐入さくら,4,町屋さくら時刻表,http://yamatocreation.cocotte.jp/bus/arakawa/matiya
:

2014年5月3日土曜日

【アプリ開発】pxからdip(dp)への変換

アプリ開発をしててコード上でレイアウト調整するときなんかに
よく使う関数ですので紹介しときます(^^)




pxからdip(dp)に変換する関数(メソッド)


    /*******************************************
     * ChangeDip()
     * ピクセルからDipにサイズを変換
     * 
     * @param  ac  Activity
     * @param  nPixel 変換するピクセル値
     * @return  Dip値
     *******************************************/
    static public int ChangeDip(Activity ac, int nPixel)
    {
        final float scale = ac.getResources().getDisplayMetrics().density;
        return (int) (nPixel * scale);
    }

dip(dp)とは
ピクセル(px)は端末ごとに異なる画面密度(dpi)によっては同じピクセル値でも見えてくるサイズが変わるため、端末ごとで一定の値となるdip(=dp)に変換しています。1dipは160dpiの画面で1px、320dpiの画面で2pxです。

2014年4月30日水曜日

【Java】Myコーディングスタイル

今回はアプリを作成する上でのJavaのコーディングスタイルとして、
自分なりに行っているコーディング規約を紹介していきます(^o^)丿

私個人のコーディング規約ですので参考程度に見ていただければと思います(^o^;

概要

細かくわかれますので概要として以下の内容についてコーディング規約を説明していきます。


・コーディングスタイル
 ■入れ子のかっこ{}で1行使う
 ■字下げはタブ、または半角スペース×2の倍数

・命名規約
 ■変数名の規則
 ■メンバ変数には「m_」を付ける
 ■定数は大文字と下線のみ
 ■長くても意味のある名前を付ける
 ■クラス名

・コメント
 ■出来る限り多くコメントをつける
 ■if文やswitch文ではすべてのケースでコメント追加
 ■不具合の修正箇所にコメントをつける 
 ■現在把握している問題についてコメント
 ■入れ子が多い場合には行末コメント
 ■Javadocに対応する書き方に統一

・プログラミング規約
 ■データ型のクラスにはfinalを宣言
 ■例外キャッチ時はprintStackTrace

・メンテナンスによる既存ソースの手入れ
 ■既存ソースでは行われていない意外性のある方法で行わない
 ■命名規約の注意
 ■コメント


2014年4月24日木曜日

【SQL】データベースの基礎(SELECT文)

こんばんは☆

先日データベーススペシャリストを受けて来ました(^^ゞ 

結果はまぁまぁで受かるかどうかは微妙なとこです^^; 

ともかくせっかく勉強したのもあるので、基礎的なデータベースの知識としてアプリ開発でも使える
SQLの形でわかりやすくまとめていきたいと思います。


今回SQLのSELECT文の例を載せ、データベースの用語を付け足します。

SELECT文だけで色々な例がわかるようにしていきますので(^^)



SELECT文 

  【選択】
SELECT * FROM score

score






id 国語 算数 理科 社会 英語

1 10 20 30 40 50

2 15 15 15 15 15

3 50 40 30 20 10

4 30 30 30 30 30

5 20 40 30 20 40







テーブルscoreの全ての行(タプル)を取り出し、全ての列(属性)を表示します。


  【射影】
SELECT person.id, person.name FROM person

person


id name

1 sinji

4 kenji

6 akira




テーブルscore の全ての行に含まれる列 id と列 name を表示します。


  【選択】【等結合】【直積】
SELECT * FROM score as s, person as p
WHERE s.id = p.id  











s.id 国語 算数 理科 社会 英語 p.id name

1 10 20 30 40 50 1 sinji

4 30 30 30 30 30 4 kenji










テーブルs(score)とテーブルp(person)を結合して、テーブルsとテーブルpに含まれる全ての列
   を表示します。
  (2つのテーブルを結合して全ての列を表示することを等結合といいます)
  (=結合する列が重複して表示=集合演算の直積ともいう



  【選択】【射影】【自然結合】
SELECT s.*, p.name FROM score as s, person as p
WHERE a.id = b.id  










id 国語 算数 理科 社会 英語 name

1 10 20 30 40 50 sinji

4 30 30 30 30 30 kenji









テーブルsとテーブルpを結合して、各テーブルに含まれる列を一部表示します。
  (2つのテーブルを結合して結合する列の重複がなく表示することを自然結合といいます)
  (=結合する列が重複なしに表示



  【選択】【和】
SELECT s.id FROM score as s
UNION
SELECT p.id FROM person as p

score
person
s+p

id
id
id

1
1
1

2
4
2

3
6
3

4


4

5


5





6







テーブルscoreの全ての行を取り出した結果に、テーブルpersonの全ての行を付け足します。
   (これは関係代数(関係モデルにおける演算体系)の集合演算のに相当します。)
  (UNIONは重複行は1つだけ表示しますが、UNION ALLだと重複行もそのまま表示します)



  【選択】【射影】【差】
SELECT s.id FROM score as s
EXCEPT
SELECT p.id FROM person as p

score
person
s-p

id
id
id

1
1
2

2
4
3

3
6
5

4





5











テーブルsの列idを取り出した結果から、テーブルpの列idを取り去ります。
   (これは関係代数(関係モデルにおける演算体系)の集合演算のに相当します。)



  【選択】【射影】【積】
SELECT s.id FROM score as s
INTERSECT
SELECT p.id FROM person as p

score
person
s×p

id
id
id

1
1
1

2
4
4

3
6



4





5











テーブルsの列idを取り出した結果から、テーブルpの列idと同じ値のものだけを取り出します。
   (これは関係代数(関係モデルにおける演算体系)の集合演算のに相当します。)



  【選択】【商】
うまくできるSQL文が見つけられていないため、後で記載
R


S

R÷S

A B X
A B
X

1 111
1 111


2 222
2 222


1 111





2 222






1 111






2 222















テーブルRからテーブルSに含まれる列全てを持つ行を選択し、選択した行からテーブルSに
  含まれていない列を取り出します。
   (これは関係代数(関係モデルにおける演算体系)の集合演算のに相当します。)