2014年11月6日木曜日

【アプリ開発】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);

  }

 }