文章标题

/**
* 新手引导页
*/
public class GuideActivity extends Activity {

private ViewPager mViewPager;
private LinearLayout llContainer;
private ImageView ivRedPoint;
private Button btnStart;

//图片id集合
private int[] mImageIds = new int[] { R.drawable.guide_1,
        R.drawable.guide_2, R.drawable.guide_3 };

private ArrayList<ImageView> mImageViews;

private int mPointDis;//圆点移动距离

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);//从代码中去掉标题栏的方法, 必须在setContentView之前调用
    setContentView(R.layout.activity_guide);
    initViews();
    initData();
}

//初始化布局
private void initViews() {
    mViewPager = (ViewPager) findViewById(R.id.vp_guide);
    llContainer = (LinearLayout) findViewById(R.id.ll_container);
    ivRedPoint = (ImageView) findViewById(R.id.iv_red_point);
    btnStart = (Button) findViewById(R.id.btn_start);
}

//初始化数据
private void initData() {
    //初始化三张图片的ImageView
    mImageViews = new ArrayList<ImageView>();
    for (int i = 0; i < mImageIds.length; i++) {
        ImageView view = new ImageView(this);
        view.setBackgroundResource(mImageIds[i]);
        mImageViews.add(view);

        //初始化小圆点
        ImageView point = new ImageView(this);
        point.setImageResource(R.drawable.shape_point_normal);

        //初始化布局参数
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        if (i > 0) {
            params.leftMargin = 10;//从第二个点开始设置左边距10px
        }

        point.setLayoutParams(params);//设置布局参数

        llContainer.addView(point);
    }

    mViewPager.setAdapter(new GuideAdapter());

    //监听ViewPager滑动事件,更新小红点位置
    mViewPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            if (position == mImageIds.length - 1) {
                //最后一个页面显示开始体验按钮
                btnStart.setVisibility(View.VISIBLE);
            } else {
                btnStart.setVisibility(View.GONE);
            }
        }

        //监听滑动事件
        @Override
        public void onPageScrolled(int position, float positionOffset,
                int positionOffsetPixels) {
            System.out.println("当前位置:" + position + ";偏移百分比:"
                    + positionOffset);

            //通过修改小红点的左边距来更新小红点的位置
            int leftMargin = (int) (mPointDis * positionOffset + position
                    * mPointDis + 0.5f);//要将当前的位置信息产生的距离加进来
            //获取小红点的布局参数
            RelativeLayout.LayoutParams params = (LayoutParams) ivRedPoint
                    .getLayoutParams();
            params.leftMargin = leftMargin;
            ivRedPoint.setLayoutParams(params);
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

    //计算圆点移动距离 = 第二个圆点的左边距-第一个圆点左边距
    //      mPointDis = llContainer.getChildAt(1).getLeft()
    //              - llContainer.getChildAt(0).getLeft();
    //      System.out.println("mPointDis:" + mPointDis);
    //      System.out.println("mPointDis1:" + llContainer.getChildAt(1).getLeft());
    //      System.out.println("mPointDis2:" + llContainer.getChildAt(0).getLeft());
    //measure->layout->draw, 必须onCreate执行结束之后,才会开始绘制布局,走此三个方法

    //监听layout执行结束的事件, 一旦结束之后, 在去获取当前的left位置
    //视图树
    ivRedPoint.getViewTreeObserver().addOnGlobalLayoutListener(
            new OnGlobalLayoutListener() {

                //一旦视图树的layout方法调用完成, 就会回调此方法
                @Override
                public void onGlobalLayout() {
                    //布局位置已经确定,可以拿到位置信息了
                    mPointDis = llContainer.getChildAt(1).getLeft()
                            - llContainer.getChildAt(0).getLeft();
                    System.out.println("mPointDis:" + mPointDis);

                    //移除观察者
                    //ivRedPoint.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    ivRedPoint.getViewTreeObserver()
                            .removeGlobalOnLayoutListener(this);
                }
            });

    //开始体验按钮点击
    btnStart.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //在sp中记录访问过引导页的状态
            PrefUtils.putBoolean(getApplicationContext(), "is_guide_show",
                    true);

            //跳到主页面
            startActivity(new Intent(getApplicationContext(),
                    MainActivity.class));
            finish();
        }
    });
}

@Override
protected void onStart() {
    super.onStart();
}

@Override
protected void onResume() {
    super.onResume();
}

class GuideAdapter extends PagerAdapter {

    @Override
    public int getCount() {
        return mImageIds.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    //初始化布局
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        //ImageView view = new ImageView(getApplicationContext());
        ImageView view = mImageViews.get(position);

        container.addView(view);

        return view;
    }

    //销毁布局
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

}

}
//布局

CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值