Android 组合View实现水平滑动效果
当标签很多而不能在一个页面显示时,希望可以通过滑动来显示未显示的标签。这个效果的实现方式有很多,比如:Gallery, TextSwitcher, 自定义View等。本文简单说明通过组合来实现这个效果,先看图片:



实现原理:在HorizontalScrollView中添加View,实现水平滚动。当点击操作时,对View的状态做修改。记录本次点击和上次点击的View,然后切换不同显示状态。
布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<HorizontalScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content" android:scrollbars="none">
<LinearLayout
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
</LinearLayout>
</HorizontalScrollView>
<TextView
android:id="@+id/displayText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="30dip"
android:textStyle="bold" />
</LinearLayout>主要代码:
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.LinearLayout.LayoutParams;
public class MyScrollViewTestActivity extends Activity implements OnClickListener {
private TextView displayText;
/**
* 装载标题的容器
*/
private LinearLayout containerLayout;
/**
* 用于显示的标题
*/
private static String[] titles = {
"发表文章", "分类管理", "评论管理", "做电子书", "博客设置",
"回收站", "我的文档", "红色警戒", "魔兽世界", "DOTA"
};
/**
* 点击子项后显示的信息
*/
private String message;
private Button lastButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
displayText = (TextView) findViewById(R.id.displayText);
containerLayout = (LinearLayout) findViewById(R.id.container);
// 添加标题相关的控件
initViews();
}
/**
* 初始化视图
*/
private void initViews() {
Button item;
LayoutParams itemParams;
for (int i = 0, length = titles.length; i < length; i++) {
// 设置按钮属性
item = new Button(this);
item.setBackgroundResource(R.drawable.item);
item.setShadowLayer(0.5f, 1, 1, Color.GRAY);
item.setText(titles[i]);
item.setTag(String.valueOf(i));
item.setOnClickListener(this);
// 设置布局参数
itemParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
itemParams.gravity = Gravity.CENTER;
containerLayout.addView(item, itemParams);
}
onClick(containerLayout.getChildAt(0));
}
@Override
public void onClick(View v) {
if (lastButton != null) {
lastButton.setBackgroundResource(R.drawable.item);
}
v.setBackgroundResource(R.drawable.item_selected);
lastButton = (Button) v;
try {
// 获得相关信息
message = titles[Integer.valueOf((String) v.getTag())];
} catch (Exception e) {
e.printStackTrace();
return;
}
// 针对不同信息,需要做的操作
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
displayText.setText(message);
}
}说明:
- lastButton:记录上次操作的View,用于操作该View的状态;
- item.xml:用于设置按钮操作的效果,如按下后的状态改变等;
- displayText:当点击某个标签时,用户显示特定信息;
item.xml代码:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/item_normal" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/>
<item android:drawable="@drawable/item_selected" android:state_selected="true"/>
<item android:drawable="@drawable/item_selected" android:state_pressed="true"/>
<item android:drawable="@drawable/item_selected" android:state_focused="true"/>
</selector>图片在附件中可以找到!:)
多说一句:可以把HorizontalScrollView部分单独做成一个View,不同事件给出一定的回调接口,方便代码的重用。本例中的子项是一个Button,也可以是一些View组合而成的控件。当标签的文字比较多时,需要合理使用draw9patch工具来控制显示效果。:)
相关推荐
xfcyhades 2020-11-20
Michael 2020-11-03
业余架构师 2020-10-09
OuNuo0 2020-09-29
moses 2020-09-22
Angelia 2020-09-11
qinxu 2020-09-10
刘炳昭 2020-09-10
Nostalgiachild 2020-09-07
Nostalgiachild 2020-08-17
leavesC 2020-08-14
一青年 2020-08-13
AndroidAiStudy 2020-08-07
ydc0 2020-07-30
绿豆饼 2020-07-28