Android Open Source - Intro-to-Android Title Fragment






From Project

Back to project page Intro-to-Android.

License

The source code is released under:

Apache License

If you think the Android project Intro-to-Android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2011 Michael Imamura//w w w . j  a v a2s . c o m
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package org.lugatgt.zoogie.present.ui;

import android.animation.ObjectAnimator;
import android.app.Fragment;
import android.content.res.Resources;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.RelativeLayout;
import android.widget.TextView;

import org.lugatgt.zoogie.present.R;
import org.lugatgt.zoogie.present.Slide;


/**
 * Displays the title.
 * This fragment may expand, depending on the current slide.
 * @author Michael Imamura
 */
public class TitleFragment extends Fragment {

    private static final String INDEX_KEY = "index";
    private static final String TITLE_KEY = "title";
    private static final String SUBTITLE_KEY = "subtitle";
    
    private ForegroundColorSpan subtitleColorSpan;
    private int normalHeight;
    private int expandedHeight;
    private int slideTransitionDuration;
    
    private RelativeLayout contentView;
    private TextView titleLbl;
    private TextView titleAnimLbl;
    private View titleFrame;
    private View titleAnimFrame;
    
    private int index;
    private CharSequence title = "";
    private CharSequence subtitle = "";
    
    // LIFECYCLE ///////////////////////////////////////////////////////////////
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        contentView = (RelativeLayout)inflater.inflate(R.layout.title, null);
        
        // Load resources -- these may change depending on orientation, etc.,
        // so we need to load them on every onCreateView().
        Resources res = getResources();
        subtitleColorSpan = new ForegroundColorSpan(res.getColor(R.color.subtitle_fg));
        normalHeight = res.getDimensionPixelSize(R.dimen.title_frag_height);
        expandedHeight = res.getDimensionPixelSize(R.dimen.title_frag_expanded_height);
        slideTransitionDuration = res.getInteger(R.integer.slideTransitionDuration);
        
        index = 0;
        
        titleLbl = (TextView)contentView.findViewById(R.id.titleLbl);
        titleAnimLbl = (TextView)contentView.findViewById(R.id.titleAnimLbl);
        titleFrame = contentView.findViewById(R.id.titleFrame);
        titleAnimFrame = contentView.findViewById(R.id.titleAnimFrame);
        
        if (savedInstanceState != null) {
            index = savedInstanceState.getInt(INDEX_KEY);
            title = savedInstanceState.getCharSequence(TITLE_KEY);
            subtitle = savedInstanceState.getCharSequence(SUBTITLE_KEY);
            // Since updateUi() changes the layout, we can't call it here
            // because the view hasn't been attached to the activity's
            // layout yet.
        }
        
        return contentView;
    }
    
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        
        if (savedInstanceState != null) {
            // We call updateUi() here since this is after our layout has been
            // attached to the activity's layout.
            updateUi(0, false);
        }
    }
    
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        
        outState.putInt(INDEX_KEY, index);
        outState.putCharSequence(TITLE_KEY, title);
        outState.putCharSequence(SUBTITLE_KEY, subtitle);
    }
    
    // CONTENT /////////////////////////////////////////////////////////////////
    
    /**
     * Update the title to reflect a new slide.
     * @param slide The new slide (may not be null).
     * @param idx The zero-based index of the slide in the presentation.
     * @param animate true to animate between the previous title and the new title.
     */
    public void setSlide(Slide slide, int idx, boolean animate) {
        CharSequence newTitle = slide.getTitle(getActivity());
        if (newTitle == null) newTitle = "";
        
        CharSequence newSubtitle = slide.getSubtitle(getActivity());
        if (newSubtitle == null) newSubtitle = "";
        
        int oldIndex = index;
        index = idx;
        title = newTitle;
        subtitle = newSubtitle;
        
        updateUi(oldIndex, animate);
    }
    
    /**
     * Update the UI elements to reflect the current state.
     * @param oldIndex The zero-based previous slide index.
     * @param animate true if moving to the new state should be animated.
     */
    private void updateUi(int oldIndex, boolean animate) {
        // Update our height, animating it if requested.
        if (oldIndex > 0 && index > 0) {
            // Do nothing, height is already correct.
        } else if (oldIndex == 0 && index > 0 && animate) {
            ObjectAnimator.ofInt(this, "contentHeight", expandedHeight, normalHeight).
                setDuration(slideTransitionDuration).start();
        } else {
            contentView.getLayoutParams().height =
                index == 0 ? expandedHeight : normalHeight;
        }
        
        SpannableStringBuilder sb = new SpannableStringBuilder();
        sb.append(title);
        if (subtitle.length() > 0) {
            // Use a different foreground color for the subtitle.
            sb.append(": ").append(subtitle);
            sb.setSpan(subtitleColorSpan, title.length() + 2, sb.length(), 0);
        }
        
        if (animate) {
            titleAnimLbl.setText(titleLbl.getText());
            titleLbl.setText(sb);
            // We animate the frames instead of the TextViews because setting
            // the alpha on a TextView with a ForegroundColorSpan doesn't
            // quite work right (the span overrides the alpha).
            ObjectAnimator.ofFloat(titleFrame, "alpha", 0.0f, 1.0f).
                setDuration(slideTransitionDuration).start();
            ObjectAnimator.ofFloat(titleAnimFrame, "alpha", 1.0f, 0.0f).
                setDuration(slideTransitionDuration).start();
        } else {
            titleLbl.setText(sb);
        }
    }
    
    /**
     * <em>Do not call this method directly!</em>
     * <p>
     * This is called by the {@link ObjectAnimator} to update the layout height
     * since {@link LayoutParams} doesn't have a public {@code setHeight()}
     * method.
     * @param height The new height in pixels.
     */
    public void setContentHeight(int height) {
        contentView.getLayoutParams().height = height;
        contentView.requestLayout();
    }
    
}




Java Source Code List

org.lugatgt.zoogie.introtoandroid.AboutActivity.java
org.lugatgt.zoogie.introtoandroid.MainActivity.java
org.lugatgt.zoogie.introtoandroid.MainPresentation.java
org.lugatgt.zoogie.introtoandroid.slide.AndroidSlide.java
org.lugatgt.zoogie.introtoandroid.slide.ApiHistorySlide.java
org.lugatgt.zoogie.introtoandroid.slide.BasicTextSlide.java
org.lugatgt.zoogie.introtoandroid.slide.ForkThisSlide.java
org.lugatgt.zoogie.introtoandroid.slide.InternalsSlide.java
org.lugatgt.zoogie.introtoandroid.slide.PartsSlide.java
org.lugatgt.zoogie.introtoandroid.slide.TitleSlide.java
org.lugatgt.zoogie.introtoandroid.ui.PartLayer.java
org.lugatgt.zoogie.introtoandroid.ui.PartsView.java
org.lugatgt.zoogie.present.Presentation.java
org.lugatgt.zoogie.present.SlideTransition.java
org.lugatgt.zoogie.present.Slide.java
org.lugatgt.zoogie.present.Transitions.java
org.lugatgt.zoogie.present.ui.AboutActivity.java
org.lugatgt.zoogie.present.ui.PresentationActivity.java
org.lugatgt.zoogie.present.ui.SlideFragment.java
org.lugatgt.zoogie.present.ui.SlideListSpinnerAdapter.java
org.lugatgt.zoogie.present.ui.TitleFragment.java