android 控件之HorizontalScrollView

    xiaoxiao2021-04-18  92

    之前由于工作的原因,需要实现一个类似于网易新闻的标签栏样式的布局,乍眼一看,可以使用Gallery,但是由于Google已经放弃了gallery,所以查阅资料后发现可以使用HorizontalScrollView来实现。今天,就让我们一起来探究一下HorizontalScrollView吧。

    话不多说,先上效果图

    实现这种效果很简单:

    1》利用Google提供的原生的HorizontalScrollView+LinearLayout实现横向滑动

    2》点击的时候记录滑动的距离,然后使用scrollTo()方法来实现滑动效果。

    在开始实现这个功能之前,我们还是先回顾下HorizontalScrollView的简单用法

    1.布局文件

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <HorizontalScrollView android:layout_width="wrap_content" android:layout_height="150dp" android:layout_gravity="center_vertical" android:background="#AA444444" android:scrollbars="none" > <LinearLayout android:id="@+id/id_gallery" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:orientation="horizontal" /> </HorizontalScrollView> </LinearLayout> 2.实现代码

    public class MainActivity extends Activity { private LinearLayout mGallery; private int[] mImgIds; private LayoutInflater mInflater; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); mInflater = LayoutInflater.from(this); initData(); initView(); } private void initData(){ mImgIds = new int[] { R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e, R.drawable.f, R.drawable.g, R.drawable.h, R.drawable.l }; } private void initView(){ mGallery = (LinearLayout) findViewById(R.id.id_gallery); for (int i = 0; i < mImgIds.length; i++) { View view = mInflater.inflate(R.layout.activity_index_gallery_item, mGallery, false); ImageView img = (ImageView) view .findViewById(R.id.id_index_gallery_item_image); img.setImageResource(mImgIds[i]); TextView txt = (TextView) view .findViewById(R.id.id_index_gallery_item_text); txt.setText("some info "); mGallery.addView(view); } } } 代码量不多,相信大家都看的懂,这里我就不多做解释了。

    那么如何实现上述的功能呢?

    还是老规矩,先贴代码

    1.布局文件

    <?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"> <HorizontalScrollView android:id="@+id/horizontalScrollView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#555555" android:fadingEdge="@null" android:scrollbars="none"> <LinearLayout android:id="@+id/title_lay" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:orientation="vertical"> <LinearLayout android:id="@+id/lay" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"/> <ImageView android:id="@+id/img1" android:layout_width="0dp" android:layout_height="4dp" android:layout_gravity="bottom" android:background="#33b5e5" /> </LinearLayout> </HorizontalScrollView> </LinearLayout> 2.实现类

    package com.juwang.androidactivity; import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.Gravity; import android.view.ViewGroup; import android.view.Window; import android.view.animation.AnimationSet; import android.view.animation.TranslateAnimation; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.RadioGroup; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainActivity extends FragmentActivity { private ImageView mImageView; private float mCurrentCheckedRadioLeft;//当前被选中的RadioButton距离左侧的距离 private HorizontalScrollView mHorizontalScrollView;//上面的水平滚动控件 private List<Map<String, String>> titleList = new ArrayList<Map<String,String>>(); private RadioGroup myRadioGroup; private int _id = 1000; private LinearLayout layout; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);//去标题 setContentView(R.layout.activity_main); initDatas(); initGroup(); } private void initDatas() { Map<String, String> map = new HashMap<String, String>(); map.put("title", "新闻"); titleList.add(map); map = new HashMap<String, String>(); map.put("title", "网页"); titleList.add(map); map = new HashMap<String, String>(); map.put("title", "体育"); titleList.add(map); map = new HashMap<String, String>(); map.put("title", "彩票"); titleList.add(map); map = new HashMap<String, String>(); map.put("title", "世界杯"); titleList.add(map); map = new HashMap<String, String>(); map.put("title", "国际"); titleList.add(map); map = new HashMap<String, String>(); map.put("title", "娱乐"); titleList.add(map); map = new HashMap<String, String>(); map.put("title", "军事"); titleList.add(map); map = new HashMap<String, String>(); map.put("title", "更多"); titleList.add(map); } private void initGroup(){ layout = (LinearLayout) findViewById(R.id.lay); mImageView = (ImageView)findViewById(R.id.img1); mHorizontalScrollView = (HorizontalScrollView)findViewById(R.id.horizontalScrollView); myRadioGroup = new RadioGroup(this); myRadioGroup.setLayoutParams( new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); myRadioGroup.setOrientation(LinearLayout.HORIZONTAL); layout.addView(myRadioGroup); for (int i = 0; i <titleList.size(); i++) { Map<String, String> map = titleList.get(i); RadioButton radio = new RadioButton(this); radio.setButtonDrawable(android.R.color.transparent); LinearLayout.LayoutParams l = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT, Gravity.CENTER); radio.setLayoutParams(l); radio.setGravity(Gravity.CENTER); radio.setPadding(40, 30, 40, 30); radio.setId(_id+i); radio.setText(map.get("title")); radio.setTextColor(Color.WHITE); radio.setTag(map); if (i == 0) { radio.setChecked(true); int itemWidth = (int) radio.getPaint().measureText(map.get("title")); mImageView.setLayoutParams(new LinearLayout.LayoutParams(itemWidth+radio.getPaddingLeft()+radio.getPaddingRight(),4)); } myRadioGroup.addView(radio); } myRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { int radioButtonId = group.getCheckedRadioButtonId(); //根据ID获取RadioButton的实例 RadioButton rb = (RadioButton)findViewById(radioButtonId); Map<String, Object> selectMap = (Map<String, Object>) rb.getTag(); AnimationSet animationSet = new AnimationSet(true); TranslateAnimation translateAnimation; translateAnimation = new TranslateAnimation(mCurrentCheckedRadioLeft, rb.getLeft(), 0f, 0f); animationSet.addAnimation(translateAnimation); animationSet.setFillBefore(true); animationSet.setFillAfter(true); animationSet.setDuration(300); mImageView.startAnimation(animationSet);//开始上面蓝色横条图片的动画切换 mCurrentCheckedRadioLeft = rb.getLeft();//更新当前蓝色横条距离左边的距离 mHorizontalScrollView.smoothScrollTo((int) mCurrentCheckedRadioLeft - (int) getResources().getDimension(R.dimen.rdo2), 0); //根据标题长度设置下标mImageView的长度 mImageView.setLayoutParams(new LinearLayout.LayoutParams(rb.getRight()-rb.getLeft(),4)); } }); } }

    在这里我大致讲解一下实现思路:

    1》首先用Linearlayout+HorizontalScrollView实现横向滑动的功能,当然我在Linearlayout里面添加的是RadioGroup,然后通过for循环的形式将RadioButton逐一添加进去。

    2》设置GrdioGroup的点击监听事件,获取点击的位置,计算距离左边的距离,然后通过scrollTo进行滑动。当然在进行scrollTo()滑动的时候,首先要判断最初的滑动距离是否小于我们设置的距离,即

    (int) getResources().getDimension(R.dimen.rdo2)的值,在头两个RadioButton滑动的时候,由于小于我们设定的值,因此整体不会发生移动,当大于我们设定的值的时候,会整体进行移动。

    好了,以上就是对HorizontalScrollView的理解,欢迎大家留言。

    转载请注明原文地址: https://ju.6miu.com/read-675274.html

    最新回复(0)