日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android之自定义控件深入

發(fā)布時(shí)間:2024/7/23 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android之自定义控件深入 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文主要講述兩個(gè)知識(shí)點(diǎn):popwindow的使用和通過(guò)繼承View實(shí)現(xiàn)一個(gè)自定義控件,實(shí)現(xiàn)點(diǎn)擊,手動(dòng)按鈕的效果.

popwindow的使用

//定義 popupWindowpopWin = new PopupWindow(MainActivity.this);popWin.setWidth(input.getWidth()); //設(shè)置寬度popWin.setHeight(200); //設(shè)置popWin 高度popWin.setContentView(listView); //為popWindow填充內(nèi)容popWin.setOutsideTouchable(true); // 點(diǎn)擊popWin 以處的區(qū)域,自動(dòng)關(guān)閉 popWinpopWin.showAsDropDown(input, 0, 0);//設(shè)置 彈出窗口,顯示的位置

自定義控件實(shí)現(xiàn)開(kāi)關(guān)拖動(dòng)按鈕

第一步:實(shí)現(xiàn)自定義控件要繼承view

public class MyToggleButton extends View implements OnClickListener{

第二步:寫(xiě)構(gòu)造函數(shù)并初始化

/*** 在代碼里面創(chuàng)建對(duì)象的時(shí)候,使用此構(gòu)造方法*/public MyToggleButton(Context context) {super(context);// TODO Auto-generated constructor stub}/*** 在布局文件中聲名的view,創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用。* @param context 上下文對(duì)象* @param attrs 屬性集*/public MyToggleButton(Context context, AttributeSet attrs) {super(context, attrs);initView();}/*** 初始化*/private void initView() {//初始化圖片backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);slideBtn = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button);//初始化 畫(huà)筆paint = new Paint();paint.setAntiAlias(true); // 打開(kāi)抗矩齒//添加onclick事件監(jiān)聽(tīng)setOnClickListener(this);}

第三步:重寫(xiě)方法

/** view 對(duì)象顯示的屏幕上,有幾個(gè)重要步驟:* 1、構(gòu)造方法 創(chuàng)建 對(duì)象。* 2、測(cè)量view的大小。 onMeasure(int,int);* 3、確定view的位置 ,view自身有一些建議權(quán),決定權(quán)在 父view手中。 onLayout();* 4、繪制 view 的內(nèi)容 。 onDraw(Canvas)*/@Override/*** 測(cè)量尺寸時(shí)的回調(diào)方法 */protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // super.onMeasure(widthMeasureSpec, heightMeasureSpec);/*** 設(shè)置當(dāng)前view的大小* width :view的寬度* height :view的高度 (單位:像素)*/setMeasuredDimension(backgroundBitmap.getWidth(),backgroundBitmap.getHeight());}//確定位置的時(shí)候調(diào)用此方法//自定義view的時(shí)候,作用不大 // @Override // protected void onLayout(boolean changed, int left, int top, int right, // int bottom) { // super.onLayout(changed, left, top, right, bottom); // }/*** 當(dāng)前開(kāi)關(guān)的狀態(tài)* true 為開(kāi)*/private boolean currState = false;@Override/*** 繪制當(dāng)前view的內(nèi)容*/protected void onDraw(Canvas canvas) { // super.onDraw(canvas);// 繪制 背景/** backgroundBitmap 要繪制的圖片* left 圖片的左邊屆* top 圖片的上邊屆* paint 繪制圖片要使用的畫(huà)筆*/canvas.drawBitmap(backgroundBitmap, 0, 0, paint);//繪制 可滑動(dòng)的按鈕canvas.drawBitmap(slideBtn, slideBtn_left, 0, paint);}

第四步:監(jiān)聽(tīng)點(diǎn)擊與拖動(dòng)事件

/*** 判斷是否發(fā)生拖動(dòng),* 如果拖動(dòng)了,就不再響應(yīng) onclick 事件* */private boolean isDrag = false;@Override/*** onclick 事件在View.onTouchEvent 中被解析。* 系統(tǒng)對(duì)onclick 事件的解析,過(guò)于簡(jiǎn)陋,只要有down 事件 up 事件,系統(tǒng)即認(rèn)為 發(fā)生了click 事件* */public void onClick(View v) {/** 如果沒(méi)有拖動(dòng),才執(zhí)行改變狀態(tài)的動(dòng)作*/if(!isDrag){currState = !currState;flushState();}}/*** down 事件時(shí)的x值*/private int firstX;/*** touch 事件的上一個(gè)x值*/private int lastX;@Overridepublic boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:firstX = lastX =(int) event.getX();isDrag = false;break;case MotionEvent.ACTION_MOVE://判斷是否發(fā)生拖動(dòng)if(Math.abs(event.getX()-firstX)>5){isDrag = true;}//計(jì)算 手指在屏幕上移動(dòng)的距離int dis = (int) (event.getX() - lastX);//將本次的位置 設(shè)置給lastXlastX = (int) event.getX();//根據(jù)手指移動(dòng)的距離,改變slideBtn_left 的值slideBtn_left = slideBtn_left+dis;break;case MotionEvent.ACTION_UP://在發(fā)生拖動(dòng)的情況下,根據(jù)最后的位置,判斷當(dāng)前開(kāi)關(guān)的狀態(tài)if (isDrag) {int maxLeft = backgroundBitmap.getWidth() - slideBtn.getWidth(); // slideBtn// 左邊屆最大值/** 根據(jù) slideBtn_left 判斷,當(dāng)前應(yīng)是什么狀態(tài)*/if (slideBtn_left > maxLeft / 2) { // 此時(shí)應(yīng)為 打開(kāi)的狀態(tài)currState = true;} else {currState = false;}flushState();}break;}flushView();return true; }

第五步:刷新當(dāng)前狀態(tài)

/*** 刷新當(dāng)前狀態(tài)*/private void flushState() {if(currState){slideBtn_left = backgroundBitmap.getWidth()-slideBtn.getWidth();}else{slideBtn_left = 0;}flushView(); }/*** 刷新當(dāng)前視力*/private void flushView() {/** 對(duì) slideBtn_left 的值進(jìn)行判斷 ,確保其在合理的位置 即 0<=slideBtn_left <= maxLeft* */int maxLeft = backgroundBitmap.getWidth()-slideBtn.getWidth(); // slideBtn 左邊屆最大值//確保 slideBtn_left >= 0slideBtn_left = (slideBtn_left>0)?slideBtn_left:0;//確保 slideBtn_left <=maxLeftslideBtn_left = (slideBtn_left<maxLeft)?slideBtn_left:maxLeft;/** 刷新當(dāng)前視圖 導(dǎo)致 執(zhí)行onDraw執(zhí)行*/invalidate();}

第六步:在layout中添加全類(lèi)名使用

<com.zj.switchbutton.MyTrouggleButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"/>

運(yùn)行效果

總結(jié)

以上是生活随笔為你收集整理的Android之自定义控件深入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。