Let’s face it: phones are small.
Even
if you have a phone with excellent screen resolution, the physical
screen size is still rarely over 3″x5″, since most people want phones
that can fit in a pocket, purse, pouch, or poncho.
This
means your Android activities can only display so much stuff at one
time without individual widgets or text getting too small to be easily
read. There are any number of ways to handle this:
- You could break the one activity into several…but this can get cumbersome
- You can use
ScrollView
to allow users to scroll through a longer activity…but this may or may not be easy for the user depending on the device (e.g., a haptic interface using a swipe for scrolling assumes there’s a place clear in the UI for them to actually swipe without accidentally toggling a button or something) - You can use
TabView
, as described in the previous post…but you are locked into a particular presentation pattern (e.g., tabs) - You can use
ViewFlipper
and work out a UI pattern that’s right for you
Not surprisingly, today, we’re going to look at the latter option.
ViewFlipper
inherits from FrameLayout
, just like we used to describe the innards of a TabView
in that previous post.
However, initially, it just shows the first child view. It is up to
you to arrange for the views to flip, either manually by user
interaction, or automatically via a timer.
For example, here is a layout for a simple activity using a
Button
and a ViewFlipper
:- 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"
- >
- <Button android:id="@+id/flip_me"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Flip Me!"
- />
- <ViewFlipper android:id="@+id/details"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textStyle="bold"
- android:textColor="#FF00FF00"
- android:text="This is the first panel"
- />
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textStyle="bold"
- android:textColor="#FFFF0000"
- android:text="This is the second panel"
- />
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textStyle="bold"
- android:textColor="#FFFFFF00"
- android:text="This is the third panel"
- />
- ViewFlipper>
- LinearLayout>
Notice that the layout defines three child views for the
ViewFlipper
, each a TextView
with a simple message. Of course, you could have very complicated child views, if you so chose.
To manually flip the views, we need to hook into the
Button
and flip them ourselves when the button is clicked:- public class FlipperDemo extends Activity {
- ViewFlipper flipper;
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- setContentView(R.layout.main);
- flipper=(ViewFlipper)findViewById(R.id.details);
- Button btn=(Button)findViewById(R.id.flip_me);
- btn.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- flipper.showNext();
- }
- });
- }
- }
This is just a matter of calling showNext() on the
ViewFlipper
, like you can on any ViewAnimator
class.
The result is a trivial activity: click the button, and the next
TextView
in sequence is displayed, wrapping around to the first after viewing the last:
This, of course, could be handled more simply by having a single
TextView
and changing the text and color on each click. However, you can imagine that the ViewFlipper
contents could be much more complicated, like the contents you might put into a TabView
.
As with the
For example, let’s look at another sample activity, using this layout:TabView
in the previous post, sometimes, your ViewFlipper
contents may not be known at compile time. As with TabView
, though, you can add new contents on the fly with ease.- 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"
- >
- <ViewFlipper android:id="@+id/details"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- ViewFlipper>
- LinearLayout>
Notice that the
ViewFlipper
has no contents at compile time. Also note that there is no Button
for flipping between the contents — more on this in a moment.
For the
ViewFlipper
contents, we will create large Button
widgets, each containing one of the random words used in many an Android tutorial. And, we will set up the ViewFlipper
to automatically rotate between the Button
widgets, using an animation for transition:- public class FlipperDemo2 extends Activity {
- static String[] items={"lorem", "ipsum", "dolor", "sit", "amet",
- "consectetuer", "adipiscing", "elit",
- "morbi", "vel", "ligula", "vitae",
- "arcu", "aliquet", "mollis", "etiam",
- "vel", "erat", "placerat", "ante",
- "porttitor", "sodales", "pellentesque",
- "augue", "purus"};
- ViewFlipper flipper;
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- setContentView(R.layout.main);
- flipper=(ViewFlipper)findViewById(R.id.details);
- flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
- flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
- for (String item : items) {
- Button btn=new Button(this);
- btn.setText(item);
- flipper.addView(btn,
- new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
- }
- flipper.setFlipInterval(2000);
- flipper.startFlipping();
- }
- }
After getting our
ViewFlipper
widget from the layout, we first set up the “in” and “out” animations.
In Android terms, an animation is a description of how a widget leaves
(”out”) or enters (”in”) the viewable area. Animations are a complex
beast, worthy of a blog post or two in their own right. For now,
realize that animations are resources, stored in res/anim/
in your project. For this tutorial, we are using a pair of animations
supplied by the SDK samples, available under the Apache 2.0 license. As
their names suggest, widgets are “pushed” to the left, either to enter
or leave the viewable area.
After iterating over the funky words, turning each into a
Button
, and adding the Button
as a child of the ViewFlipper
, we set up the flipper to automatically flip between children (flipper.setFlipInterval(2000);
) and to start flipping (flipper.startFlipping();
).
The
result is an endless series of buttons, each appearing, then sliding
out to the left after 1.5 seconds, being replaced by the next button in
sequence, wrapping around to the first after the last has been shown:
In this case, the above screenshot shows the
ViewFlipper
in mid-transition, animating away from one button to the next.
The auto-flipping
ViewFlipper
is useful for status panels or other situations where you have a lot
of information to display, but not much room. The key is that, since it
automatically flips between views, expecting users to interact with
individual views is dicey — the view might switch away part-way through
their interaction.
No comments:
Post a Comment