电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

android使用ViewPager實現圖片自動切換

瀏覽:116日期:2022-09-27 09:30:46

本文實現viewpager圖片輪播的功能、左右滑動的時候能夠流暢的切換圖片、并且沒有邊界限制

1、activity_main.xml布局

<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' > <RelativeLayout android: android:layout_width='match_parent' android:layout_height='match_parent'/> </RelativeLayout>

因為我的ViewPager是繼承RelativeLayout

2、layout_recommend_item.xml中的布局

<?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' android:orientation='vertical' android:layout_width='match_parent' android:layout_height='match_parent'> <ImageView android: android:layout_width='match_parent' android:layout_height='match_parent' android:src='http://www.hdgsjgj.cn/bcjs/@mipmap/ic_launcher' android:layout_weight='1'/> <TextView android: android:text='123' android:layout_width='match_parent' android:layout_height='wrap_content' /> </LinearLayout>

ImageView是顯示圖片 TextView用來顯示每一個pager的標題

3、MyViewPager類,因為圖個方便,把能夠實現這個功能否合成一個類、這樣用起來比較方便

import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.Handler;import android.os.Message;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.util.DisplayMetrics;import android.util.Log;import android.util.TypedValue;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.TextView; import java.util.ArrayList;import java.util.List; public class MyViewPager extends RelativeLayout { private static final int START_SCROLL = 1; private static final int SCROLL_NEXT = 2; private static final int SHOW_TIME = 5000;//顯示時間 private List<String> mDatas = new ArrayList<>();//viewpager每一頁對應的標題 private ViewPager mPager; private Context mContext; private int mWidth, mHeight; //viewpager的寬高 private int mTitleHeight; //標題高度 private TipView mTipView; //標題對應的view //在主ui中更新viewpager,也就是切換圖片 private static Handler sHandler = new Handler() { @Override public void handleMessage(Message msg) { int w = msg.what; ViewPager pager = (ViewPager) msg.obj; switch (w) { case START_SCROLL: pager.setCurrentItem(msg.arg1, true); break; case SCROLL_NEXT: pager.setCurrentItem(msg.arg1, true); break; } } }; /** * 構造函數 * @param context content * @param w 要顯示的viewpager的寬 * @param h 要顯示的viewpager的高 */ public MyViewPager(Context context, int w, int h) { super(context); mContext = context; mWidth = w; mHeight = h; initView(); //取得數據 左邊隨便取的 只是為了看起來有效果// 對viewpager滑動進行監聽 mPager.setOnPageChangeListener(new MOnPagerChangeListener()); init(); DisplayMetrics dm = mContext.getResources().getDisplayMetrics(); mTitleHeight = cm_DptoPx(48, dm); } /** * 對viewpager控件進行繪制寬高 */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { ViewGroup.LayoutParams vp = getLayoutParams(); if (vp != null) { vp.width = mWidth; vp.height = mHeight; } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } /** * 把dp轉化成px */ public static int cm_DptoPx(int dp,DisplayMetrics dis){ return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, dis); } private void init() { getData(); } private void initView() { mPager = new ViewPager(mContext); RelativeLayout.LayoutParams rp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); addView(mPager, rp); } public void getData() { for (int i = 0; i < 4 ; i++){ mDatas.add(i,'viewpager'+i); } sHandler.postDelayed(new Runnable() { @Override public void run() { stopAnimation(); initTipView(); mPager.setAdapter(new RecommendAdapter()); mPager.setCurrentItem(10000 * mDatas.size()); } }, 2000); } /** * 刪除隊列中的消息 */ public void stopAnimation() { sHandler.removeMessages(START_SCROLL); sHandler.removeMessages(SCROLL_NEXT); } public void startAnimation() { if (mDatas.size() == 0) { return; } Message msg = sHandler.obtainMessage(START_SCROLL); msg.obj = mPager; msg.arg1 = (mPager.getCurrentItem() + 1);//取得后一張圖片 sHandler.sendMessageDelayed(msg, SHOW_TIME);//5秒后發送給ui線程 } /** * 對標題view移動的光標初始化 */ private void initTipView() { if (mTipView == null) { RelativeLayout.LayoutParams rp = new RelativeLayout.LayoutParams(10, 10); rp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); rp.bottomMargin = mTitleHeight; mTipView = new TipView(mContext, mDatas.size()); addView(mTipView, rp); } else { mTipView.setCount(mDatas.size()); } } private class MOnPagerChangeListener implements ViewPager.OnPageChangeListener { private int curState; @Override public void onPageScrolled(int i, float v, int i1) { } @Override public void onPageSelected(int i) { //滑動結束 sHandler.removeMessages(SCROLL_NEXT); sHandler.removeMessages(START_SCROLL); if(curState == ViewPager.SCROLL_STATE_DRAGGING){ return; } Message msg = sHandler.obtainMessage(SCROLL_NEXT); msg.arg1 = i + 1; msg.obj = mPager; sHandler.sendMessageDelayed(msg, SHOW_TIME); mTipView.setCurPostion(i % mDatas.size()); } @Override public void onPageScrollStateChanged(int i) { //正在滑動時 curState = i; if(i == ViewPager.SCROLL_STATE_DRAGGING){ //SCROLL_STATE_DRAGGING正在滑動 SCROLL_STATE_IDLE什么都沒有做 //SCROLL_STATE_SETTLING 滑動完畢 stopAnimation(); }else { if(!(sHandler.hasMessages(START_SCROLL)&&sHandler.hasMessages(SCROLL_NEXT))){ startAnimation(); } } } } private class RecommendAdapter extends PagerAdapter { @Override public Object instantiateItem(ViewGroup container, int position) { Log.i('MyViewPager','instantiateItem '); int curPos = position % mDatas.size(); View view = View.inflate(mContext, R.layout.layout_recommend_item, null); ViewGroup.LayoutParams vp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); ImageView iv = (ImageView) view.findViewById(R.id.iv_pic); TextView tv = (TextView) view.findViewById(R.id.tv_desc); tv.setText(mDatas.get(curPos)); container.addView(view, vp); view.setTag(curPos); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); return view; } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object o) { return view == o; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } private class TipView extends View { private int mPadding; private int mCount; private int mCurPos; private Paint mNorPaint; private Paint mSelPaint; private int mHeight; public TipView(Context context, int count) { super(context); mNorPaint = new Paint(); mNorPaint.setAntiAlias(true); DisplayMetrics dm = context.getResources().getDisplayMetrics(); int selHeight = cm_DptoPx(2, dm); int norHeight = cm_DptoPx(1, dm); mHeight = cm_DptoPx(2, dm); mNorPaint.setStrokeWidth(norHeight); mNorPaint.setColor(Color.argb(80, 255, 255, 255)); mSelPaint = new Paint(); mSelPaint.setAntiAlias(true); mSelPaint.setStrokeWidth(selHeight); mSelPaint.setColor(Color.WHITE); mCount = count; mPadding = cm_DptoPx(0, dm); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int ow = (getWidth()-2*mPadding)/ mCount; int y = getHeight() / 2; canvas.drawLine(mPadding, y, mCurPos * ow + mPadding, y, mNorPaint); canvas.drawLine(mCurPos * ow + mPadding, y, (mCurPos + 1) * ow + mPadding, y, mSelPaint); canvas.drawLine((mCurPos + 1) * ow + mPadding, y, getWidth() - mPadding, y, mNorPaint); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { ViewGroup.LayoutParams vp = getLayoutParams(); vp.width = ViewGroup.LayoutParams.MATCH_PARENT; vp.height = mHeight; super.onMeasure(widthMeasureSpec, heightMeasureSpec); } public void setCurPostion(int pos) { mCurPos = pos; invalidate(); } public void setCount(int count) { mCount = count; } }}

4、還有MainActivity中的實現

import android.app.Activity;import android.os.Bundle;import android.util.DisplayMetrics;import android.widget.RelativeLayout; public class MainActivity extends Activity { private RelativeLayout mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DisplayMetrics dm = getResources().getDisplayMetrics(); mViewPager = (RelativeLayout) findViewById(R.id.my_viewpager); mViewPager.addView(new MyViewPager(getApplicationContext(),dm.widthPixels ,(dm.widthPixels)/2)); }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
主站蜘蛛池模板: 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 原子吸收设备-国产分光光度计-光谱分光光度计-上海光谱仪器有限公司 | 三氯异氰尿酸-二氯-三氯-二氯异氰尿酸钠-优氯净-强氯精-消毒片-济南中北_优氯净厂家 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 高清视频编码器,4K音视频编解码器,直播编码器,流媒体服务器,深圳海威视讯技术有限公司 | 上海皓越真空设备有限公司官网-真空炉-真空热压烧结炉-sps放电等离子烧结炉 | 办公室家具_板式办公家具定制厂家-FMARTS福玛仕办公家具 | 三轴曲线机-端子插拔力试验机|华杰仪器 | 合肥白癜风医院_合肥治疗白癜风医院_合肥看白癜风医院哪家好_合肥华研白癜风医院 | 南京交通事故律师-专打交通事故的南京律师 | 常州律师事务所_常州律所_常州律师-江苏乐天律师事务所 | 胶原检测试剂盒,弹性蛋白检测试剂盒,类克ELISA试剂盒,阿达木单抗ELISA试剂盒-北京群晓科苑生物技术有限公司 | 专业广州网站建设,微信小程序开发,一物一码和NFC应用开发、物联网、外贸商城、定制系统和APP开发【致茂网络】 | 章丘丰源机械有限公司 - 三叶罗茨风机,罗茨鼓风机,罗茨风机 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 滚塑PE壳体-PE塑料浮球-警示PE浮筒-宁波君益塑业有限公司 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | 压缩空气检测_气体_水质找上海京工-服务专业、价格合理 | 振动筛-交叉筛-螺旋筛-滚轴筛-正弦筛-方形摇摆筛「新乡振动筛厂家」 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 深圳品牌设计公司-LOGO设计公司-VI设计公司-未壳创意 | 蜜蜂职场文库_职场求职面试实用的范文资料大全 | Type-c防水母座|贴片母座|耳机接口|Type-c插座-深圳市步步精科技有限公司 | 在线悬浮物浓度计-多参数水质在线检测仪-上海沃懋仪表科技有限公司 | ASA膜,ASA共挤料,篷布色母料-青岛未来化学有限公司 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 网络推广公司_网络营销方案策划_企业网络推广外包平台-上海澜推网络 | 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 退火炉,燃气退火炉,燃气热处理炉生产厂家-丹阳市丰泰工业炉有限公司 | 14米地磅厂家价价格,150吨地磅厂家价格-百科| MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 上海租奔驰_上海租商务车_上海租车网-矢昂汽车服务公司 | 无轨电动平车_轨道平车_蓄电池电动平车★尽在新乡百特智能转运设备有限公司 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 新疆系统集成_新疆系统集成公司_系统集成项目-新疆利成科技 | 淬火设备-钎焊机-熔炼炉-中频炉-锻造炉-感应加热电源-退火机-热处理设备-优造节能 | 自恢复保险丝_贴片保险丝_力特保险丝_Littelfuse_可恢复保险丝供应商-秦晋电子 | 贝朗斯动力商城(BRCPOWER.COM) - 买叉车蓄电池上贝朗斯商城,价格更超值,品质有保障! | 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 |