Android中启动页ViewPager和ViewFlipper带指示器

Android自定义Indicator指示器,可搭配ViewPager2使用 实现Android ViewPager2的自定义Indicator 阅读详情

首先我们来分析一下,想要实现启动页的功能,大家第一个想到的就是使用ViewPager,使用ViewPager确实是一种比较好的方式,而且思路也是比较清晰的。今天我们就一起来学习一下,使用ViewPager和ViewFlipper实现启动页带小点功能。
先展示一下图片,看看是不是你想要的效果。
这里写图片描述
这里写图片描述

1、ViewPager和ViewFlipper的区别

ViewFlipper继承ViewAnimator,切换view的时候是有动画效果的,适合做ppt,多界面的程序欢迎引导界面,算是个轻量级的组件,适合展示静态数据,少量数据。

ViewPager继承ViewGroup。看官网描述,这货和Fragment是好搭档,Fragment有自己的生命周期。也就是说ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实现数据的动态加载。

2、使用ViewPager来展示mipmap中或者网络中的图片(Volley)

首先,我们来理一下有几个注意点。
①先在布局文件中,画出简单的布局。
②滑动ViewPager时候,底部的小点也会跟着变化。
③点击小点时,ViewPager也会变化。
好了,现在我们来开始写代码,代码中的注释比较详细,大家自己看。
1、布局文件中,画出布局。
layout中,activity_view_pager_demo.xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context="com.llay.admin.mydemo.ViewPagerDemoActivity">


    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v4.view.ViewPager>


    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="20dp"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/iv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_margin="5dp"
            android:background="@drawable/point_selector"
            android:clickable="true"
            android:padding="5dp" />

        <ImageView
            android:id="@+id/iv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_margin="5dp"
            android:background="@drawable/point_selector"
            android:clickable="true"
            android:padding="5dp" />

        <ImageView
            android:id="@+id/iv3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_margin="5dp"
            android:background="@drawable/point_selector"
            android:clickable="true"
            android:padding="5dp" />

        <ImageView
            android:id="@+id/iv4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_margin="5dp"
            android:background="@drawable/point_selector"
            android:clickable="true"
            android:padding="5dp" />
    </LinearLayout>
</RelativeLayout>

解释:代码中使用相对布局,这样,下面的指示器就可以显示在ViewPager上面,这样便于效果的实现。我这里下面的指示器是固定写的,根据图片的多少进行添加和删除。
最后一个layout文件单独写的:
activity_view_pager4.xm

public class ViewPagerDemoActivity extends Activity implements ViewPager.OnPageChangeListener, View.OnClickListener {
    //设置ViewPager和view视图
    private ViewPager viewPager;
    private int[] imageId = {R.mipmap.launcher_b, R.mipmap.launcher_c, R.mipmap.launcher_b};
    private List<View> viewList;
    private List<ImageUrlBean> imageList;
    private View lastView;
    //设置小圆点
    private ImageView[] points;//存放小圆圈数组
    private int currentIndex = 0;//当前页面,默认首页
    //使用Volley加载网络图片
    private RequestQueue mQueue;
    private ImageLoader mImageLoader;
    ImageLoader.ImageListener imageListener;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_view_pager_demo);
        mQueue = Volley.newRequestQueue(this);
//        initViewPage();
        initNetView();
        initPoints();
    }

    //这里是加载mipmap中图片的方式,初始化ViewPager及其图片资源
    private void initViewPage() {
        viewPager = (ViewPager) findViewById(R.id.view_pager);
        viewList = new ArrayList<>();
        //添加对应的view进入集合(数据源)
        for (int i = 0; i < imageId.length; i++) {
            ImageView imageView = new ImageView(this);
            imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);//设置缩放样式
            imageView.setImageResource(imageId[i]);
            viewList.add(imageView);
        }
        //另外增加最后一个能点击进入应用的视图
        lastView = View.inflate(this, R.layout.activity_view_pager4, null);
        Button button = (Button) lastView.findViewById(R.id.startbutton);
        viewList.add(lastView);
        //设置最后一个视图上的点击事件
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ViewPagerDemoActivity.this, "应用开始!", Toast.LENGTH_SHORT).show();
            }
        });
        //设置viewpager的适配器和数据源
        ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(viewList);
        viewPager.setAdapter(viewPagerAdapter);
        viewPager.setOnPageChangeListener(this);
    }


//这里是加载网络图片的方式,初始化ViewPager控件及其图片资源
    private void initNetView() {
        viewPager = (ViewPager) findViewById(R.id.view_pager);
        ImageUrlBean imageUrlBean1 = new ImageUrlBean("http://www.qq6300.com/uploads/allimg/130131/1-1301311G339A9.jpg");
        ImageUrlBean imageUrlBean2 = new ImageUrlBean("http://img4.duitang.com/uploads/item/201412/13/20141213114411_QEshv.jpeg");
        ImageUrlBean imageUrlBean3 = new ImageUrlBean("http://pic27.nipic.com/20130329/10041959_102531181000_2.jpg");
        imageList = new ArrayList<>();
        imageList.add(imageUrlBean1);
        imageList.add(imageUrlBean2);
        imageList.add(imageUrlBean3);
        //添加对应的view进入集合(数据源)
        viewList = new ArrayList<>();
        for (int i = 0; i < imageList.size(); i++) {
            ImageView imageView = new ImageView(this);
            imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);//设置缩放样式
            mImageLoader = new ImageLoader(mQueue, new ImageLoader.ImageCache() {
                @Override
                public Bitmap getBitmap(String s) {
                    return null;
                }

                @Override
                public void putBitmap(String s, Bitmap bitmap) {

                }
            });
            imageListener = ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher);
            mImageLoader.get(imageList.get(i).getImageUrl(), imageListener);
            viewList.add(imageView);
        }
        //另外增加最后一个能点击进入应用的视图
        lastView = View.inflate(this, R.layout.activity_view_pager4, null);
        Button button = (Button) lastView.findViewById(R.id.startbutton);
        viewList.add(lastView);
        //设置最后一个视图上的点击事件
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ViewPagerDemoActivity.this, "应用开始!", Toast.LENGTH_SHORT).show();
            }
        });
        //设置viewpager的适配器和数据源
        ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(viewList);
        viewPager.setAdapter(viewPagerAdapter);
        viewPager.setOnPageChangeListener(this);
    }

    //初始化下标点
    private void initPoints() {
        LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ll);
        points = new ImageView[4];
        //初始化布局中的小圆点ImageView控件
        for (int i = 0; i < points.length; i++) {
            points[i] = (ImageView) linearLayout.getChildAt(i);//遍历LinearLayout下的所有ImageView子节点
            points[i].setEnabled(true);//设置当前状态为允许点击(可点,灰色)
            points[i].setOnClickListener(this);//设置点击监听
            //额外设置一个标识符,以便点击小圆点时跳转对应页面
            points[i].setTag(i);//标识符与圆点顺序一致
        }
        currentIndex = 0;
        points[currentIndex].setEnabled(false);//设置首页为当前页(不可点,黑色)
    }


    @Override
    public void onClick(View v) {
        viewPager.setCurrentItem((int) v.getTag());
    }


    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        //当前页卡被选择时,position为当前页数
        points[position].setEnabled(false);//不可点击
        points[currentIndex].setEnabled(true);//恢复之前页面状态
        currentIndex = position;
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
}

解释:这里有几个地方需要注意的,
1、这里添加数据源的方式,有两种方式:mipmap文件中和网络上的图片地址,我想,大家使用启动页功能的时候,一定是想要动态的从网络上获取吧,这样才能够获得最新的数据。
2、使用加载网路图片功能,作者使用的是Volley框架,别问我为啥选这个啊,因为其他还没用过,哈哈。
3、好了,这里我们遇到了文章开头时遇到的问题,当滑动ViewPager时,指示器也要跟着滑动,这里我们继承ViewPager.OnPageChangeListener,实现一些常用的方法,代码中都有注释,请自行查看。
4、还有一个是点击指示器的时候,ViewPager也跟着一起滑动。这里我们继承View.OnClickListener方法,这个方法就是点击事件,viewPager.setCurrentItem((int) v.getTag());便可以跳转到所点击的界面,然后指示器在跳到指定界面之后,也会有相应的颜色变化。

3、ViewPager的适配器代码
ViewPagerAdapter.javpublic class ViewPagerAdapter extends PagerAdapter {
private List list;

public ViewPagerAdapter(List list) {
    this.list = list;
}


//获取要滑动的控件的数量,在这里我们以滑动的广告栏为例,那么这里就应该是展示的广告图片的ImageView数量
@Override
public int getCount() {
    return list.size();
}

//来判断显示的是否是同一张图片,这里我们将两个参数相比较返回即可
@Override
public boolean isViewFromObject(View view, Object object) {
    return view == object;//官方demo给出的建议写法
}

//当要显示的图片可以进行缓存的时候,会调用这个方法进行显示图片的初始化,我们将要显示的ImageView加入到ViewGroup中,然后作为返回值返回即可
@Override
public Object instantiateItem(ViewGroup container, int position) {
    container.addView(list.get(position));
    return list.get(position);
}

//PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将图片销毁
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView(list.get(position));
}

}示器的布局。
现在,我们来实现一下指示器的圆点,之前我一直以为,指示器的圆点就是让UI画出来的,原来还可以通过这种方式来实现。直接上代码。
未点击的圆点。
drawable文件中。v_point_up.xml文件

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <corners android:radius="0.5dp" />

    <solid android:color="#AAFFFFFF" />

</shape>

点击的圆点。
drawable文件中。v_point_down.xml文件

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <corners android:radius="0.5dp" />

    <solid android:color="#55000000" />

</shape>

主布局文件中的point_selector.xml文件,这个文件的功能是在选择指示器之后,可以让指示器的颜色用代码改变。
drawbale文件中。point_selector.xml文件

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/v_point_up" android:state_enabled="true"></item>

    <item android:drawable="@drawable/v_point_down" android:state_enabled="false"></item>

</selector>

解释:请注意这里是android:state_enabled属性,表示状态是否可以点击。

2、使用ViewFlipper来展示mipmap中的图片

这里我没有用ViewFlipper来展示网络图片
1、布局文件:
同上ViewPager中的主布局文件和第四个布局文件,还有指示器的布局文件。
2、ViewFlipperActivity.java文件

public class ViewFlipperActivity extends Activity implements GestureDetector.OnGestureListener, View.OnClickListener {
    //设置ViewFlipper和view视图
    private ViewFlipper viewFlipper;
    private int[] imageId = {R.mipmap.launcher_b, R.mipmap.launcher_c, R.mipmap.launcher_b};
    View lastView;
    //设置小圆点
    private ImageView[] points;//存放小圆圈数组
    private int currentIndex = 0;//当前页面,默认首页
    //设置手势
    GestureDetector gestureDetector;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_view_flipper);
        gestureDetector = new GestureDetector(ViewFlipperActivity.this);
        initViewFlipper();
        initPoints();
    }

    //初始化ViewFlipper
    private void initViewFlipper() {
        viewFlipper = (ViewFlipper) findViewById(R.id.viewflipper);
        //添加对应的view进入集合(数据源)
        for (int i = 0; i < imageId.length; i++) {
            ImageView imageView = new ImageView(this);
            imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);//设置缩放样式
            imageView.setImageResource(imageId[i]);
            viewFlipper.addView(imageView);
        }
        //另外增加最后一个能点击进入应用的视图
        lastView = View.inflate(this, R.layout.activity_view_pager4, null);
        Button button = (Button) lastView.findViewById(R.id.startbutton);
        viewFlipper.addView(lastView);
        //设置最后一个视图上的点击事件
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ViewFlipperActivity.this, "应用开始!", Toast.LENGTH_SHORT).show();
            }
        });
    }

    //初始化下标点
    private void initPoints() {
        LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ll);
        points = new ImageView[4];
        //初始化布局中的小圆点ImageView控件
        for (int i = 0; i < points.length; i++) {
            points[i] = (ImageView) linearLayout.getChildAt(i);//遍历LinearLayout下的所有ImageView子节点
            points[i].setEnabled(true);//设置当前状态为允许点击(可点,灰色)
            points[i].setOnClickListener(this);//设置点击监听
            //额外设置一个标识符,以便点击小圆点时跳转对应页面
            points[i].setTag(i);//标识符与圆点顺序一致
        }
        currentIndex = 0;
        points[currentIndex].setEnabled(false);//设置首页为当前页(不可点,黑色)
    }


    @Override
    public void onClick(View v) {
        //点击小点,改变小点的状态,并且改变viewFlipper中子view的显示
        viewFlipper.setDisplayedChild((int) v.getTag());
        points[(int) v.getTag()].setEnabled(false);
        points[currentIndex].setEnabled(true);
        currentIndex = (int) v.getTag();
    }


    //用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

    //用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
    //注意和onDown()的区别,强调的是没有松开或者拖动的状态
    @Override
    public void onShowPress(MotionEvent e) {

    }

    //用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }

    //用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        return false;
    }

    //用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
    @Override
    public void onLongPress(MotionEvent e) {

    }

    //用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE,1个ACTION_UP触发
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if (e2.getX() - e1.getX() > 120) {
            //为了避免能够一直向右滑动
            if (viewFlipper.getDisplayedChild() != 0) {
                //向右滑动,设置滑动动画
                viewFlipper.setInAnimation(AnimationUtils.loadAnimation(ViewFlipperActivity.this,
                        R.anim.push_right_in));
                viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(ViewFlipperActivity.this,
                        R.anim.push_right_out));
                //这个要判断,不然就会跳到第一个
                viewFlipper.showPrevious();
                //当前页卡被选择时,viewFlipper.getDisplayedChild()为当前页数
                points[viewFlipper.getDisplayedChild()].setEnabled(false);//不可点击
                points[currentIndex].setEnabled(true);//恢复之前页面状态
                currentIndex = viewFlipper.getDisplayedChild();
                return true;
            }
        } else if (e2.getX() - e1.getX() < 120) {
            //为了避免能够一直向左滑动
            if (viewFlipper.getDisplayedChild() != viewFlipper.getChildCount() - 1) {
                //向左滑动,设置滑动动画
                viewFlipper.setInAnimation(AnimationUtils.loadAnimation(ViewFlipperActivity.this,
                        R.anim.push_left_in));
                viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(ViewFlipperActivity.this,
                        R.anim.push_left_out));
                //这个要判断,不然就会跳到最后一个
                viewFlipper.showNext();
                //当前页卡被选择时,viewFlipper.getDisplayedChild()为当前页数
                points[viewFlipper.getDisplayedChild()].setEnabled(false);//不可点击
                points[currentIndex].setEnabled(true);//恢复之前页面状态
                currentIndex = viewFlipper.getDisplayedChild();
                return true;
            }
        }
        return false;
    }


    //用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return this.gestureDetector.onTouchEvent(event);
    }

}

解释:这里我用ViewFlipper实现这个启动页的功能,一开始以为应该会比ViewPager实现容易,但是自己后来弄了一下,感觉自己还是不怎么能弄出来。我来讲一下有几处要注意的。
1、使用ViewFlipper来实现启动页功能,需要使用手势。让类继承GestureDetector.OnGestureListener接口,实现一些必要的方法。主要是onFling()方法。
2、为了让ViewFlipper不能一直的滑动下去。需要判断是不是第一个和最后一个,使用 if (viewFlipper.getDisplayedChild() != 0)判断是不是第一个,使用if (viewFlipper.getDisplayedChild() != viewFlipper.getChildCount() - 1)判断是不是最后一个。
3、在滑动了ViewFlipper之后,我们也要考虑和ViewPager相同的两个问题。ViewFlipper滑动带动指示器,指示器点击带动ViewFlpper。
使用

//当前页卡被选择时,viewFlipper.getDisplayedChild()为当前页数
                points[viewFlipper.getDisplayedChild()].setEnabled(false);//不可点击
                points[currentIndex].setEnabled(true);//恢复之前页面状态
                currentIndex = viewFlipper.getDisplayedChild();

来使ViewFlipper滑动,带动指示器的滑动。
使用

//点击小点,改变小点的状态,并且改变viewFlipper中子view的显示
        viewFlipper.setDisplayedChild((int) v.getTag());
        points[(int) v.getTag()].setEnabled(false);
        points[currentIndex].setEnabled(true);
        currentIndex = (int) v.getTag();

来点击指示器,带动ViewFlipper的跳转。

注意:可能是方法不同的原因,在ViewPager中,setCurrentItem(int item)方法就可以直接调用第几个界面,然后再触发onPageSelected(int position)方法,使得指示器按钮变化。而在ViewFlipper中,setDisplayedChild(int childid)方法只能调用第几个界面,不能触发onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)方法,onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)方法只能通过滑动来获得。

4、需要注意的是,使用手势的时候,一定要实现这个方法,不然手势不能生效。原因,查了好多,都是说未知。

//用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return this.gestureDetector.onTouchEvent(event);
    }
Android两种方式实现横向滚动图标+指示器 啊哈,先上应用效果图,符合你的需求,你再继续看这篇博文哈~ 类型1 :RecyclerView实现非分页效果的左右滑动 类型2 :ViewPager+RecyclerView实现分页效果的左右滑动 GitHub地址 : https://github.com/xiaoyaomeng/TopicView/tree/master 类型1:RecyclerView实现非分页效果的左右滑动 private... 阅读详情

相关推荐

自定义Android ViewPager控件实现指示器

在init()方法中,我们通过LayoutInflater加载了一个布局文件(layout_indicator_viewpager.xml),其中包含了一个ViewPager和一个指示器容器(indicatorContainer)。在该布局文件中,我们使用了一个LinearLayout作为指示器容器,并设置了水平方向的排列方式。通过以上的代码和布局,我们可以在Android应用中使用IndicatorViewPager来实现滑动切换页面,并在底部显示相应的指示器,用于指示当前页面的位置。

2301_79326588的博客 721

安卓实现随Viewpager滑动而滑动的指示器小圆点

此前在网上看到好多大神写的指示器,也有带平移效果的,但是都不是怎么满意,菜鸟的我今天在这里贡献一下利用shape和自定义View实现的Viewpager指示器,并且还可以多种自定义样式哦,欢迎大家共同来探讨和评论,代码还有很多优化及修改的地方欢迎大家发表意见 下面展示一下效果: 有需要的小伙伴可以在下方留言这里将发送demo,近期可能会更新上码云,需要码云链接的可以在下方评论,话不多说下面展示核...

Android爬坑牛奶糖的博客 2682

Android studio ViewPager2 底部圆点指示器应用设计

【代码】Android studio ViewPager2 底部圆点指示器应用设计。

corlin6688的博客 2273

android仿空间照片查看器,PhotoViewer 一个简单仿微信朋友圈的图片查看器

该图片查看器是模仿微信朋友圈查看图片编写 allprojects {repositories {...maven { url 'https://jitpack.io' }}}lastRelease: dependencies {implementation 'com.github.wanglu1209:PhotoViewer:lastRelease'}使用点击多张图片...

weixin_42214654的博客 1080

电商项目功能简述

1.电商行业的技术特点 1.技术性 2.技术范围广 3.分布式 4.高并发,集群,负载均衡,高可用 5.海量数据 6.业务复杂 7.系统安全 2.电商行业的模式 B2B:企业到企业,商家到商家.代表:阿里巴巴 B2C:商家到客户.代表:京东.淘宝商城 C2C:客户到客户.淘宝集市 O2O:线上到线下 3.B2C电商系统架构功能模块 4.B2C电商系统架构功能描述 后台管理系统:管理商品、订单、类...

weixin_45116848的博客 9744

别再纠结高侧低侧了!用INA199/INA219这类集成电流检测芯片,5分钟搞定精准电流测量

本文详细解析了使用INA199/INA219等集成电流检测芯片实现精准电流测量的高效方案。通过对比传统分立元件方案,突出集成芯片在精度、温度稳定性和设计简化方面的优势,并提供硬件设计避坑指南和软件实现最佳实践,帮助开发者快速掌握电流检测技术。

weixin_42685438的博客 470

Android开发 - ViewPager和ViewFlipper控件的使用 - 实现图片内容轮播(无限滚动、自动滚动和显示小白点)

文章目录ViewPager简单demo - 手动滑动添加动画设置监听无限滚动自动滚动小白点手势或者触摸监听触摸监听事件手势监听事件点击事件ViewFlipper简单demo动画事件监听 突发奇想,想到了APP上的图片轮播的功能,感觉很实用啊,就查了一下,然后学一学玩一玩。 不仅可以用于App首页的图片内容轮播,还可以用于启动页的滑动介绍等等。 ViewPager ViewPager是Android...

RBK的博客 1781

Flutter项目在M1/M2 Mac上跑iOS模拟器报错?手把手教你搞定‘arm64架构不兼容’问题

本文详细解析了Flutter项目在M1/M2 Mac上运行iOS模拟器时遇到的‘arm64架构不兼容’问题,提供了多种解决方案,包括排除模拟器的arm64架构、强制使用x86_64架构以及修改插件Podspec文件。帮助开发者快速解决架构兼容性问题,提升开发效率。

weixin_33713707的博客 335

Android: 制作引导页

“造轮子”制作引导页的方式: 一个Splash界面 ViewPager ViewFlipper ScrollView 引导页框架: AppIntro guideshow SlidingTuorial-Android Splash界面: 非常简单的界面停留若干秒的时间,然后进入主界面。 背景一张图,然后Handler延迟几秒进入即可。类似于启动页。 Handle...

手写我对你的温柔 1139

深入解析ST MC SDK(WorkBench)工程结构:从零搭建FOC电机控制项目

本文深入解析了ST MC SDK(WorkBench)工程结构,详细介绍了如何从零搭建FOC电机控制项目。通过ST MC SDK和WorkBench工具链,开发者可以快速配置电机类型、控制策略等参数,生成完整的FOC控制工程。文章还拆解了工程结构中的核心控制模块、HAL硬件抽象层、芯片系统初始化和电机控制算法库,并提供了无传感器FOC实战技巧和常见问题排查指南,帮助开发者高效掌握STM32F407ZGT6开发板上的FOC电机控制技术。

weixin_29173777的博客 411

从零开始玩转机械臂:用Matlab+Robotics Toolbox实现四自由度机械臂运动仿真

本文详细介绍了如何利用Matlab及其Robotics Toolbox工具箱,从零开始构建并仿真一个四自由度机械臂。通过D-H参数建模、正向运动学验证、交互式操控以及轨迹规划等实践步骤,帮助初学者在虚拟环境中直观理解机器人运动学核心概念,为后续硬件实现奠定坚实基础。

weixin_29055699的博客 324

Android引导页的四种实现方式

四种方式制作引导页 1、一个splash界面 一个非常简洁的页面,停留若干秒的时间,然后进入到主界面,程序执行步骤: 在刚刚打开的时候,程序会在sharedpreference本地注册表文件中去读取是否第一次打开应用,如果是,把这个界面展示给用户看,以后第二次,第三次都不会再显示这个界面 代码展示: 创建一个SplashActivity和对应的activity_splash布局文件,在m

weixin_40290793的博客 8566

Windows10下RTABMAP+T265实现三维建图

win10+rtabmap+t265扫描地形

Suxiang1997的博客 3486

android 安装后首次启动的欢迎页面的总结和demo

本例子一种介绍了四种启动方式来 1 2 3 4

彭思正的博客 1万+

国家基本比例尺分幅土地利用现状图制作

本次主要解决的问题是如何构建脚本快速生成所涉及区域标准国家基本比例尺分幅,然后制作土地利用现状图模板,套用模板生成标准分幅土地利用现状图。

xyt1172228177的博客 2458

搞定ESD(七):静电放电问题典型案例分析(二)

静电放电噪声耦合的方式主要是:传导耦合与辐射耦合,辐射耦合主要以磁场耦合、 电场耦合为主要形式。电场耦合发生的主要条件是:静电放电高频在参考地平面寄生电感中产生电平波动,平行于参考地平面上的较长信号布线就很容易通过分布电容发生电场耦合。根据高速信号回流路径的特性可知,其回流路径是贴近信号布线下方,或者信号两侧,若信号回流路径跨分割后,环路面积会随之增大;信号环路面积大从EMI角度看其空间辐射更强,从EMS角度看则更容易耦合外部噪声干扰(雷击浪涌、EFT、ESD、RS)。

记得诚 2801

ViewFlipper实现引导页面

之前做引导页的时候,一直使用的是ViewPager, 只是后来滑动的时候会卡顿的情况。看了半天,才发现viewPager是重量级的控件,一般和fragment来配套使用。看ViewPager的官方介绍就知道,以下截取了一点: /** * Layout manager that allows the user to flip left and right * through pages o

730

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

android引导页viewpager实现

每一个优质的APP都会有一个引导页。 试过用viewflipper,但效果比较生硬。所以尝试了viewpager。 需求分析: 程序安装后第一次启动: 启动页-->功能引导页-->应用主页 以后启动: 启动页-->应用主页 实现原理: 用SharedPreferences实现。 创建一个boolean的变量,默认值为true。 当判断这个变量是true的时候,说明是第一

PYROMANIA 794

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android开发教程viewpager2点击指示标也能切换

viewpager2的使用范例,关键是点击指示标也能切换

聪哥的专栏 365

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

android ViewPager 指示器 PageIndicator

一款 google写的 ViewPager 指示器 PageIndicator

lmjssjj的专栏 1640

Android自定义ViewPager图片指示器,兼容实现底部横线指示器

前言  记得以前自己使用过的ViewPager Indicator有JakeWharton大神的开源库ViewPagerIndicator,v4包自带的PagerTitleStrip以及Android Support Design库的TabLayout。它们基本上可以实现项目中常见的ViewPager指示器的需求,除非你的项目有特色的指示器需求,如指示器不再是tab底部横线,而是一个三角形或是其...

宿罪的博客 4471

Android 打造万能的ViewPagerIndicator 指示器

/**稀土掘金,时光不老**/ 大家好,又是项目中用到的小功能,拿来和大家分享交流一下,如有不足之处,请多多指教哈。O(∩_∩)O哈哈~ 1. 概述。 ViewPager的指示器相信大家都做过了,有用图片,第三方的,有support.design库中TabLayout,也有大多数人都用过的TabPageIndicator等等,并且很多知名APP都使用过这个开源的指示器。,我也用过,但是感

wujainEW的博客 8021

Android指示器的使用总结

一.Android指示器的基础知识 Android指示器实现的三种基础方法: 1.使用PagerTitleStrip 2.使用PagerTabStrip 3.使用自定义的View设计宽度

wenzhi的博客 4262

Android开发-各种各样好看漂亮的进度条,指示器,加载提示汇总【代码粘过来就可以用】

导读:之前项目中用到一些进度条,找了不少,但是我们产品是个傻X,什么效果都要做成跟ios效果一样的,所有一些本来很好看的进度条也被下了,打算写个demo自己总结一下,留着以后用, 有些是自己写的,有些是github上找的别人的库,如果大家觉得好看可以用,直接下载复制代码到项目里就可以用,ok 废话少说,先上图 1.绿色进度条,可以固定的 布局; xmlns:android

panghaha12138的博客 2万+
上一篇: Android中使用ShareSDK功能学习
下一篇: Android的banner(轮播图)的实现
llayjun
博客等级 码龄12年 73粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值