2011-02-14 15 views
1

ギャラリー内でFrameLayoutをギャラリーアイテムとして使用しました。 TextLayout内には2つのRelativeLayoutsがあり、それぞれTextViewとImageViewを保持しています。ギャラリーの外に「Flip」と呼ばれるボタンがあります。 「フリップ」ボタンをクリックすると、相対レイアウトが1つ隠され、フリップアニメーションで別のレイアウトが表示されます。また、ギャラリーの外にTextViewがあり、テキストを更新しています。ユーザーがギャラリーをスクロールして別のアイテムを選択すると、GalleryのsetOnItemSelectedメソッドからTextViewが更新されます。FramLayout外のテキストビュー内のテキストを変更しているときにFrameLayoutアニメーションが機能しない

問題は、setOnItemSelectedメソッドからTextViewを更新しないと、反転アニメーションが正しく機能することです。しかし、TextViewを更新しても、アニメーションは機能しません。 FrameLayout内でRelativeLayoutを切り替えることさえありません。

誰かが問題がどこにあるのかわからない場合は、私を助けてください。ここで

は、メイン画面用XMLレイアウトです:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:gravity="top|center" android:background="#0000"> 

<RelativeLayout android:id="@+id/RelativeLayout04" android:layout_height="fill_parent" android:layout_width="fill_parent"><RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/top_bar" android:layout_alignParentTop="true" android:id="@+id/headerRelativeLayout"><Button android:id="@+id/homeButton" android:layout_height="wrap_content" android:layout_marginTop="5dip" android:background="@drawable/home_button_open" android:layout_marginLeft="5dip" android:layout_width="wrap_content" android:layout_alignParentLeft="true"></Button> 
<Button android:id="@+id/backButton" android:layout_height="wrap_content" android:layout_marginTop="5dip" android:background="@drawable/back_button" android:layout_toRightOf="@+id/homeButton" android:layout_width="wrap_content"></Button> 
<TextView android:layout_height="wrap_content" android:textSize="22sp" android:layout_toLeftOf="@+id/LinearLayout02" android:gravity="center" android:layout_toRightOf="@+id/backButton" android:id="@+id/TextView02" android:layout_width="fill_parent" android:textStyle="bold" android:layout_centerInParent="true"></TextView> 

<LinearLayout android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_centerVertical="true" android:layout_marginRight="10dip" android:id="@+id/LinearLayout02"> 

<com.vocabAhead.SATVocab.LoginButton android:layout_marginRight="5dip" android:id="@+id/facebookButton" android:layout_width="wrap_content" android:background="@drawable/facebook_button" android:layout_height="wrap_content"></com.vocabAhead.SATVocab.LoginButton> 

<Button android:id="@+id/settingsButton" android:layout_width="wrap_content" android:background="@drawable/settings_button" android:layout_height="wrap_content" android:layout_gravity="center_vertical"></Button> 

</LinearLayout> 
</RelativeLayout> 
<RelativeLayout android:layout_width="fill_parent" android:layout_height="35dip" android:background="#FF212121" android:layout_alignParentBottom="true" android:id="@+id/footerRelativeLayout"> 

<Button android:id="@+id/playButton" android:layout_height="wrap_content" android:background="@drawable/play_button" android:layout_marginLeft="10dip" android:layout_width="wrap_content" android:layout_centerVertical="true" android:layout_alignParentLeft="true"></Button> 

<Button android:layout_alignParentRight="true" android:id="@+id/showScriptButton" android:layout_height="wrap_content" android:background="@drawable/infobutton" android:layout_marginRight="10dip" android:layout_width="wrap_content" android:layout_centerVertical="true"></Button> 

<TextView android:layout_height="wrap_content" android:textColor="#FFFF" android:id="@+id/itemSerialTextView" android:layout_width="wrap_content" android:layout_centerInParent="true"></TextView> 

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="5dip" android:layout_toRightOf="@+id/playButton" android:id="@+id/durationTextView" android:textColor="#FFFF"></TextView> 


</RelativeLayout> 

<Gallery android:id="@+id/wordsGallery" android:layout_above="@+id/footerRelativeLayout" android:layout_below="@+id/headerRelativeLayout" android:layout_height="fill_parent" android:layout_width="fill_parent" android:scrollbars="none" android:scrollbarSize="0dip" android:layout_margin="0dip" android:gravity="fill" android:padding="0dip" android:background="#0000"></Gallery> 

</RelativeLayout> 

</LinearLayout> 

そしてここでは、ギャラリー項目のXMLレイアウトです:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/container" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" android:layout_margin="0dip" android:padding="0dip"> 

<RelativeLayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/wordDetailsRelativeLayout" android:background="#FFFF"> 

<TextView android:gravity="center" android:textSize="18sp" android:layout_alignParentTop="true" android:layout_width="fill_parent" android:text="Apathy" android:textStyle="bold" android:layout_height="wrap_content" android:layout_marginBottom="5dip" android:layout_marginTop="5dip" android:id="@+id/wordTextView" android:textColor="#FF1a3f6e"></TextView> 

<TextView android:gravity="center" android:layout_width="fill_parent" android:text="verb" android:layout_height="wrap_content" android:id="@+id/partsOfSpeechTextView" android:layout_below="@+id/wordTextView" android:layout_marginBottom="5dip"></TextView> 

<LinearLayout android:paddingBottom="5dip" android:layout_width="fill_parent" android:gravity="center" android:background="#FFFF" android:id="@+id/LinearLayout01" android:layout_height="wrap_content" android:layout_alignParentBottom="true"><ImageView android:src="@drawable/iphone_vocabulary_logo_15" android:id="@+id/logoImageView" android:layout_height="wrap_content" android:layout_width="wrap_content"></ImageView> 
</LinearLayout> 

<LinearLayout android:layout_height="fill_parent" android:layout_marginBottom="5dip" android:layout_width="fill_parent" android:layout_below="@+id/partsOfSpeechTextView" android:orientation="vertical" android:id="@+id/imageAndMeaningLinearLayout" android:gravity="top|center_horizontal" android:layout_above="@+id/LinearLayout01"><ImageView android:id="@+id/wordImageView" android:layout_height="wrap_content" android:layout_width="wrap_content"></ImageView> 

<TextView android:layout_height="wrap_content" android:id="@+id/wordMeaningTextView" android:layout_width="wrap_content" android:textColor="#F000" android:textSize="15sp" android:layout_marginLeft="10dip" android:layout_marginTop="10dip" android:layout_marginRight="10dip" android:gravity="center"></TextView> 

</LinearLayout> 

</RelativeLayout> 


<RelativeLayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:background="#FFFF" android:id="@+id/wordScriptRelativeLayout" android:visibility="gone"> 
<TextView android:gravity="center" android:textSize="18sp" android:layout_alignParentTop="true" android:layout_width="fill_parent" android:text="Apathy" android:textStyle="bold" android:layout_height="wrap_content" android:layout_marginBottom="5dip" android:layout_marginTop="5dip" android:textColor="#FF1a3f6e" android:id="@+id/wordTextView2"></TextView> 

<TextView android:gravity="center" android:layout_width="fill_parent" android:text="verb" android:layout_height="wrap_content" android:id="@+id/partsOfSpeechTextView2" android:layout_below="@+id/wordTextView2" android:layout_marginBottom="5dip"></TextView> 

<LinearLayout android:paddingBottom="5dip" android:layout_width="fill_parent" android:gravity="center" android:background="#FFFF" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:id="@+id/LinearLayout02"><ImageView android:src="@drawable/iphone_vocabulary_logo_15" android:id="@+id/logoImageView" android:layout_height="wrap_content" android:layout_width="wrap_content"></ImageView> 

</LinearLayout> 

<LinearLayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/wordScriptLinearLayout" android:gravity="top|center_horizontal" android:layout_below="@+id/partsOfSpeechTextView2" android:layout_above="@+id/LinearLayout02"><TextView android:layout_height="wrap_content" android:layout_margin="10dip" android:id="@+id/wordScriptTextView" android:layout_width="fill_parent" android:textColor="#F000" android:textSize="15sp"></TextView> 

</LinearLayout> 

</RelativeLayout> 

</FrameLayout> 

メイン画面では、ユーザーがshowScriptButtonをクリックしたときに(フッタの右ボタン)を押すと、framelayoutの1つの相対レイアウトが別のレイアウトに切り替わります。相対レイアウトの切り替えはフリップアニメーションで示されます。

今、フッターの中央にテキストビューがあります。そのテキストビューのテキストをコードから変更すると、フレームレイアウトで相対レイアウトが変更されなくても、フリップアニメーションは機能しません。

これはギャラリーのためsetOnItemSelectedListener方法であって、ここで

wordsGallery.setOnItemSelectedListener(new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> arg0, View arg1, 
       int position, long arg3) { 

      durationTextView.setText(""); 

     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 

     } 
    }); 

はのplayButtonするための方法である:

private void playAudio() { 
    if(isPaused) { 
     myRefreshThread = new Thread(new secondCountDownRunner()); 
     myRefreshThread.start(); 
     audioPlayer.start(); 
    } else { 
     audioPlayer = MediaPlayer.create(this, ApplicationCache.wordAudioList.get(word.wordText)); 
     audioPlayer.setOnCompletionListener(this); 
     int totalDuration = audioPlayer.getDuration()/1000; 
     String durationText = ""; 
      int min = totalDuration/60; 
      int seconds = totalDuration % 60; 
      if(min < 10) 
       durationText = "0"; 
      durationText += min+":"; 
      if(seconds < 10) 
       durationText += "0"; 
      durationText += seconds; 
     System.out.println("Duration of audio:"+durationText); 
     durationTextView.setText(durationText); 
     myRefreshThread = new Thread(new secondCountDownRunner()); 
     myRefreshThread.start(); 
     audioPlayer.start(); 
    } 
    isPaused = false; 
    isPlaying = true; 
    playButton.setBackgroundResource(R.drawable.pause_button); 
} 

そして、ここではsecondCountDownRunnerスレッドです:

class secondCountDownRunner implements Runnable{ 
    // @Override 
    public void run() { 
     while(!Thread.currentThread().isInterrupted()){ 
      Message m = new Message(); 
      m.what = 2; 
      audioPlayerHandler.sendMessage(m); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       Thread.currentThread().interrupt(); 
      } 
     } 
    } 
} 

、ここでaudioPlayerHandler:

ですここ
audioPlayerHandler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) 
     { 
       if(msg.what == 1) { 
        if(isPlaying) { 
         if(wordsGallery.getSelectedItemPosition() < (ApplicationCache.dontKnowWords.size() - 1)) { 
         //currentPosition++; 
         //currentGalleryPosition++; 
         //isWordScriptShowing = false; 
         //updateWordDetails(); 
         word = wordsList.get(wordsGallery.getSelectedItemPosition() + 1); 
         wordsGallery.setSelection(wordsGallery.getSelectedItemPosition() + 1, true); 

         playAudio(); 
         } 
        } 
       } else if(msg.what == 2) { 
        if(isPlaying) { 
         int duration = audioPlayer.getDuration()/1000; 
         int currentPosition = audioPlayer.getCurrentPosition()/1000; 
         int timeLeft = duration - currentPosition; 
         if(timeLeft < 0) 
          timeLeft = 0; 
         String durationText = ""; 
         int min = timeLeft/60; 
         int seconds = timeLeft % 60; 
         if(min < 10) 
          durationText = "0"; 
         durationText += min+":"; 
         if(seconds < 10) 
          durationText += "0"; 
         durationText += seconds; 
         durationTextView.setText(durationText); 

        } 
       }    
     }   
    }; 

はshowScriptButtonがクリックされたときに呼び出されるメソッドです:ここでは

public void flipView(int position) { 
    applyRotation(0, 90, position); 
    isFrontShowing[position] = !isFrontShowing[position];  
} 

private void applyRotation(float start, float end, int position) { 
    // Find the center of image 
    final float centerX, centerY; 
    if(isFrontShowing[position] == true) { 
     centerX = detailsLayout[position].getMeasuredWidth()/2.0f; 
     centerY = detailsLayout[position].getMeasuredHeight()/2.0f; 
    } else { 
     centerX = scriptLayout[position].getMeasuredWidth()/2.0f; 
     centerY = scriptLayout[position].getMeasuredHeight()/2.0f; 
    } 

    //System.out.println("center X:"+centerX+",Y:"+centerY); 
    // Create a new 3D rotation with the supplied parameter 
    // The animation listener is used to trigger the next animation 
    final Flip3dAnimation rotation = 
      new Flip3dAnimation(start, end, centerX, centerY); 
    rotation.setDuration(500); 
    rotation.setFillAfter(true); 
    rotation.setInterpolator(new AccelerateInterpolator()); 
    rotation.setAnimationListener(new DisplayNextView(isFrontShowing[position], detailsLayout[position], scriptLayout[position])); 

    if (isFrontShowing[position] == true) 
    { 
     //detailsLayout[position].requestFocus(); 
     //detailsLayout[position].bringToFront(); 
     detailsLayout[position].startAnimation(rotation); 
    } else { 
     //System.out.println("---Backward flipping started..."); 
     //scriptLayout[position].requestFocus(); 
     //scriptLayout[position].bringToFront(); 
     scriptLayout[position].startAnimation(rotation); 
    } 

} 

はFlip3dAnimationクラスです:

import android.graphics.Camera; 

輸入android.graphics.Matrix。 import android.view.animation.Animation; import android.view.animation。変換;

public class Flip3dAnimation extends Animation { プライベートfinal float mFromDegrees; プライベートfinal float mToDegrees; プライベート最終フロートmCenterX; プライベートfinal float mCenterY; プライベートカメラmCamera;

public Flip3dAnimation(float fromDegrees, float toDegrees, float centerX, 
     float centerY) { 
    mFromDegrees = fromDegrees; 
    mToDegrees = toDegrees; 
    mCenterX = centerX; 
    mCenterY = centerY; 
} 

@Override 
public void initialize(int width, int height, int parentWidth, 
     int parentHeight) { 
    super.initialize(width, height, parentWidth, parentHeight); 
    mCamera = new Camera(); 
} 

@Override 
protected void applyTransformation(float interpolatedTime, Transformation t) { 
    final float fromDegrees = mFromDegrees; 
    float degrees = fromDegrees 
      + ((mToDegrees - fromDegrees) * interpolatedTime); 

    final float centerX = mCenterX; 
    final float centerY = mCenterY; 
    final Camera camera = mCamera; 

    final Matrix matrix = t.getMatrix(); 

    camera.save(); 

    camera.rotateY(degrees); 

    camera.getMatrix(matrix); 
    camera.restore(); 

    matrix.preTranslate(-centerX, -centerY); 
    matrix.postTranslate(centerX, centerY); 

} 

}

DisplayNextViewクラス:

import android.view.animation.Animation; 

インポートandroid.widget.RelativeLayout。

public final class DisplayNextViewは、Animation.AnimationListenerを実装しています。 プライベートboolean mCurrentView; RelativeLayout layout1; RelativeLayout layout2;

public DisplayNextView(boolean currentView, RelativeLayout layout1, 
     RelativeLayout layout2) { 
    mCurrentView = currentView; 
    this.layout1 = layout1; 
    this.layout2 = layout2; 
} 

public void onAnimationStart(Animation animation) { 

} 

public void onAnimationEnd(Animation animation) { 
    layout1.post(new SwapViews(mCurrentView, layout1, layout2));   
} 

public void onAnimationRepeat(Animation animation) { 
} 

}

SwapViewsクラス:

import android.view.View; 

インポートandroid.view.animation.Animation。 import android.view.animation.DecelerateInterpolator; import android.view.animation.Animation.AnimationListener; import android.widget.RelativeLayout;

public final class SwapViewsはRunnableを実装しています{ private boolean mIsFirstView; RelativeLayout layout1; RelativeLayout layout2;

public SwapViews(boolean isFirstView, RelativeLayout layout1, RelativeLayout layout2) { 
    mIsFirstView = isFirstView; 
    this.layout1 = layout1; 
    this.layout2 = layout2; 
} 

public void run() { 
    final float centerX, centerY; 
    if(mIsFirstView) { 
     centerX = layout1.getWidth()/2.0f; 
     centerY = layout1.getHeight()/2.0f; 
    } else { 
     centerX = layout2.getWidth()/2.0f; 
     centerY = layout2.getHeight()/2.0f; 
    } 

    Flip3dAnimation rotation; 

    if (mIsFirstView == true) { 
     layout1.setVisibility(View.GONE); 
     layout2.setVisibility(View.VISIBLE); 
     layout2.requestFocus(); 
     layout2.bringToFront(); 
     rotation = new Flip3dAnimation(-90, 0, centerX, centerY); 
    } else { 
     layout2.setVisibility(View.GONE); 
     layout1.setVisibility(View.VISIBLE); 
     layout1.requestFocus(); 
     layout1.bringToFront(); 
     rotation = new Flip3dAnimation(-90, 0, centerX, centerY); 
    } 

    rotation.setDuration(500); 
    rotation.setFillAfter(true); 
    rotation.setInterpolator(new DecelerateInterpolator()); 
    rotation.setAnimationListener(new AnimationListener() { 

     @Override 
     public void onAnimationStart(Animation arg0) { 

     } 

     @Override 
     public void onAnimationRepeat(Animation arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onAnimationEnd(Animation arg0) { 
      WordDetailItemAdapter.notifyAdapter(); 
     } 
    }); 
    if (mIsFirstView == true) { 
     layout2.startAnimation(rotation); 
    } else { 
     layout1.startAnimation(rotation); 
    } 
} 

}

誰もがこの問題に関するいくつかのアイデアを持っています。助けてください。

+1

レイアウトXMLといくつかのコードをペーストできますか? –

+0

これは実際にJava、特にこのsetOnItemSelectedメソッドを見るのに役立ちます。 – Amplify91

答えて

1

あなたのメインレイアウトで、なぜRelativeLayout04がトップレベルのLinearLayoutの唯一の子ですか?あなたのレイアウトの複雑さはこの問題に関係するかもしれないと思いますので、ここではandroid:layout_weightを使って、ヘッダーやフッターで使われていないスペースをギャラリーに埋め込む簡単な方法を提案しています。これが役に立ったら教えてください。

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#0000" 
    > 

    <!-- Header --> 
    <RelativeLayout 
     android:id="@+id/headerRelativeLayout" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     > 
     ... 
    </RelativeLayout> 

    <!-- The gallery --> 
    <Gallery 
     android:id="@+id/wordsGallery" 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:layout_weight="1" 
     ... 
     /> 


    <!-- Footer -->  
    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="35dip" 
     android:background="#FF212121" 
     android:layout_alignParentBottom="true" 
     > 
     ... 
    </RelativeLayout> 

</LinearLayout> 
+0

申し訳ありませんが、動作しませんでした。 – gypsicoder

+0

さらに再生ボタンをクリックすると、フッターがギャラリーの上に表示されます。 – gypsicoder

+0

Javaコードでレイアウトを操作しない限り不可能です。これまでに投稿したコードよりもはるかに多くのコードが実行されています。あなたの完全な "再生"ボタンのクリックハンドラーを投稿してください。 –

関連する問題