电子商务网站推广计划,兼职网站项目建设报告,网页制作中级证书,规模以上工业企业数量功能要求是屏幕上固定显示 3 个 Layout 项(图片文字)#xff0c;支持点击切换到选择的 Layout 项#xff0c;并支持滑动切换到最近的 Layout 项。最后的效果如下#xff1a;下面逐步上代码#xff1a;布局文件 activity_main.xml 如下#xff1a;xmlns:toolshttp://…功能要求是屏幕上固定显示 3 个 Layout 项(图片文字)支持点击切换到选择的 Layout 项并支持滑动切换到最近的 Layout 项。最后的效果如下下面逐步上代码布局文件 activity_main.xml 如下xmlns:toolshttp://schemas.android.com/tools android:layout_widthmatch_parentandroid:layout_heightmatch_parent android:paddingLeftdimen/activity_horizontal_marginandroid:paddingRightdimen/activity_horizontal_marginandroid:paddingTopdimen/activity_vertical_marginandroid:paddingBottomdimen/activity_vertical_margin tools:context.MainActivityandroid:layout_heightwrap_content /android:idid/hsvandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:scrollbarStyleoutsideInsetandroid:idid/avatar_layoutandroid:layout_widthwrap_contentandroid:layout_heightwrap_content/android:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_belowid/hsvandroid:layout_marginTop12dpandroid:idid/scrollx_tv/android:onClickonClickScrollXandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_belowid/scrollx_tvandroid:layout_marginTop12dpandroid:text滚动位置/上面的 HorizontalScrollView 中使用了自定义的 HSVLayout 布局定义(HSVLayout.java)如下public class HSVLayout extends LinearLayout {private HSVAdapter adapter;private Context context;public HSVLayout(Context context, AttributeSet attrs) {super(context, attrs);this.context context;}/*** 设置布局适配器** param layoutWidthPerAvatar 指定了每一个 item 的占用宽度* param adapter 适配器* param notify 在点击某一个 item 后的回调*/public void setAdapter(int layoutWidthPerAvatar, HSVAdapter adapter,final INotifySelectItem notify) {this.adapter adapter;for (int i 0; i final Map map adapter.getItem(i);View view adapter.getView(i, null, null);// 为视图设定点击监听器final int finalI i;view.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View v) {// 点击选择了某一个 Item 视图notify.select(finalI);}});this.setOrientation(HORIZONTAL);// 设置固定显示的每个 item 布局的宽度this.addView(view, new LinearLayout.LayoutParams(layoutWidthPerAvatar, LayoutParams.WRAP_CONTENT));}}}HSVLayout 中的每一个 视图 item 都是由 HSVAdapter 进行设置的这个比较简单只控制了每一个 item 的展示不影响整个水平滚动视图public class HSVAdapter extends BaseAdapter {private static final String TAG HSV;private List lstAvatars;private Context context;private int layoutWidthPerAvatar;public HSVAdapter(Context context, int layoutWidthPerAvatar){this.contextcontext;this.lstAvatars new ArrayList();this.layoutWidthPerAvatar layoutWidthPerAvatar;}Overridepublic int getCount() {return lstAvatars.size();}Overridepublic Map getItem(int location) {return lstAvatars.get(location);}Overridepublic long getItemId(int arg0) {return arg0;}public void addObject(Map map){lstAvatars.add(map);notifyDataSetChanged();}Overridepublic View getView(int location, View arg1, ViewGroup arg2) {View view LayoutInflater.from(context).inflate(R.layout.user_avatar,null);view.setLayoutParams(new ViewGroup.LayoutParams(layoutWidthPerAvatar,ViewGroup.LayoutParams.WRAP_CONTENT));TextView tvIndex (TextView) view.findViewById(R.id.index_tv);tvIndex.setText(index- String.valueOf(location));return view;}}其对应的布局文件 user_avatar.xml 如下android:orientationverticalandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:gravitycenterandroid:layout_width64dpandroid:layout_height64dpandroid:srcdrawable/avatar/android:idid/index_tvandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:gravitycenter /最后看一下主页面 MainActivitypublic class MainActivity extends ActionBarActivityimplements INotifySelectItem {private static final String TAG Main;private HorizontalScrollView hsv;private HSVLayout layoutAvatar;private HSVAdapter adapterAvatar;private TextView tvScrollX;private int layoutWidthPerAvatar 0;private Integer[] p_w_picpaths {R.drawable.avatar,R.drawable.avatar,R.drawable.avatar,R.drawable.avatar,R.drawable.avatar,R.drawable.avatar,R.drawable.avatar,R.drawable.avatar,R.drawable.avatar};// 记录当前居中的头像索引private int currentIndex 1;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);int width DisplayUtil.getScreenWidth(this);int layoutWidth (int) (width - getResources().getDimension(R.dimen.activity_horizontal_margin) * 2);// 每一个头像占用的宽度layoutWidthPerAvatar layoutWidth / 3;hsv (HorizontalScrollView) findViewById(R.id.hsv);hsv.setOnTouchListener(new View.OnTouchListener() {private int lastScrollX 0;private int TouchEventId -9987832;Handler handler new Handler() {Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what TouchEventId) {if (lastScrollX hsv.getScrollX()) {// 停止滚动计算合适的位置(采用四舍五入)int indexScrollTo Math.round(lastScrollX/(layoutWidthPerAvatar*1.0f));Log.d(TAG, stop scroll - lastScrollX | layoutWidthPerAvatar | lastScrollX/(layoutWidthPerAvatar*1.0f) | indexScrollTo);if (indexScrollTo 0) {hsv.smoothScrollTo(indexScrollTo*layoutWidthPerAvatar, 0);} else {hsv.smoothScrollTo(0, 0);}} else {handler.sendMessageDelayed(handler.obtainMessage(TouchEventId), 100);lastScrollX hsv.getScrollX();}}}};Overridepublic boolean onTouch(View v, MotionEvent event) {Log.d(TAG, touch event - action: event.getAction() | event.getX() | event.getY() | hsv.getScrollX() | hsv.getScrollY());if (event.getAction() MotionEvent.ACTION_UP) {handler.sendMessageDelayed(handler.obtainMessage(TouchEventId), 100);}return false;}});layoutAvatar (HSVLayout) findViewById(R.id.avatar_layout);adapterAvatar new HSVAdapter(this, layoutWidthPerAvatar);for (int i 0; i Map map new HashMap();map.put(p_w_picpath, p_w_picpaths[i]);map.put(index, (i1));adapterAvatar.addObject(map);}layoutAvatar.setAdapter(layoutWidthPerAvatar, adapterAvatar, this);tvScrollX (TextView) findViewById(R.id.scrollx_tv);}Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.menu_main, menu);return true;}Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id item.getItemId();//noinspection SimplifiableIfStatementif (id R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}Overridepublic void select(int position) {Toast.makeText(this, select String.valueOf(position),Toast.LENGTH_SHORT).show();if (position 0) {if (currentIndex ! position) {hsv.smoothScrollTo((position-1)*layoutWidthPerAvatar, 0);currentIndex position;}}}public void onClickScrollX(View view) {tvScrollX.setText(Scroll.x String.valueOf(hsv.getScrollX()));}}