Android之自定义控件深入
生活随笔
收集整理的這篇文章主要介紹了
Android之自定义控件深入
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文主要講述兩個知識點:popwindow的使用和通過繼承View實現一個自定義控件,實現點擊,手動按鈕的效果.
popwindow的使用
//定義 popupWindowpopWin = new PopupWindow(MainActivity.this);popWin.setWidth(input.getWidth()); //設置寬度popWin.setHeight(200); //設置popWin 高度popWin.setContentView(listView); //為popWindow填充內容popWin.setOutsideTouchable(true); // 點擊popWin 以處的區域,自動關閉 popWinpopWin.showAsDropDown(input, 0, 0);//設置 彈出窗口,顯示的位置自定義控件實現開關拖動按鈕
第一步:實現自定義控件要繼承view
public class MyToggleButton extends View implements OnClickListener{第二步:寫構造函數并初始化
/*** 在代碼里面創建對象的時候,使用此構造方法*/public MyToggleButton(Context context) {super(context);// TODO Auto-generated constructor stub}/*** 在布局文件中聲名的view,創建時由系統自動調用。* @param context 上下文對象* @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);//初始化 畫筆paint = new Paint();paint.setAntiAlias(true); // 打開抗矩齒//添加onclick事件監聽setOnClickListener(this);}第三步:重寫方法
/** view 對象顯示的屏幕上,有幾個重要步驟:* 1、構造方法 創建 對象。* 2、測量view的大小。 onMeasure(int,int);* 3、確定view的位置 ,view自身有一些建議權,決定權在 父view手中。 onLayout();* 4、繪制 view 的內容 。 onDraw(Canvas)*/@Override/*** 測量尺寸時的回調方法 */protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // super.onMeasure(widthMeasureSpec, heightMeasureSpec);/*** 設置當前view的大小* width :view的寬度* height :view的高度 (單位:像素)*/setMeasuredDimension(backgroundBitmap.getWidth(),backgroundBitmap.getHeight());}//確定位置的時候調用此方法//自定義view的時候,作用不大 // @Override // protected void onLayout(boolean changed, int left, int top, int right, // int bottom) { // super.onLayout(changed, left, top, right, bottom); // }/*** 當前開關的狀態* true 為開*/private boolean currState = false;@Override/*** 繪制當前view的內容*/protected void onDraw(Canvas canvas) { // super.onDraw(canvas);// 繪制 背景/** backgroundBitmap 要繪制的圖片* left 圖片的左邊屆* top 圖片的上邊屆* paint 繪制圖片要使用的畫筆*/canvas.drawBitmap(backgroundBitmap, 0, 0, paint);//繪制 可滑動的按鈕canvas.drawBitmap(slideBtn, slideBtn_left, 0, paint);}第四步:監聽點擊與拖動事件
/*** 判斷是否發生拖動,* 如果拖動了,就不再響應 onclick 事件* */private boolean isDrag = false;@Override/*** onclick 事件在View.onTouchEvent 中被解析。* 系統對onclick 事件的解析,過于簡陋,只要有down 事件 up 事件,系統即認為 發生了click 事件* */public void onClick(View v) {/** 如果沒有拖動,才執行改變狀態的動作*/if(!isDrag){currState = !currState;flushState();}}/*** down 事件時的x值*/private int firstX;/*** touch 事件的上一個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://判斷是否發生拖動if(Math.abs(event.getX()-firstX)>5){isDrag = true;}//計算 手指在屏幕上移動的距離int dis = (int) (event.getX() - lastX);//將本次的位置 設置給lastXlastX = (int) event.getX();//根據手指移動的距離,改變slideBtn_left 的值slideBtn_left = slideBtn_left+dis;break;case MotionEvent.ACTION_UP://在發生拖動的情況下,根據最后的位置,判斷當前開關的狀態if (isDrag) {int maxLeft = backgroundBitmap.getWidth() - slideBtn.getWidth(); // slideBtn// 左邊屆最大值/** 根據 slideBtn_left 判斷,當前應是什么狀態*/if (slideBtn_left > maxLeft / 2) { // 此時應為 打開的狀態currState = true;} else {currState = false;}flushState();}break;}flushView();return true; }第五步:刷新當前狀態
/*** 刷新當前狀態*/private void flushState() {if(currState){slideBtn_left = backgroundBitmap.getWidth()-slideBtn.getWidth();}else{slideBtn_left = 0;}flushView(); }/*** 刷新當前視力*/private void flushView() {/** 對 slideBtn_left 的值進行判斷 ,確保其在合理的位置 即 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;/** 刷新當前視圖 導致 執行onDraw執行*/invalidate();}第六步:在layout中添加全類名使用
<com.zj.switchbutton.MyTrouggleButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"/>運行效果
總結
以上是生活随笔為你收集整理的Android之自定义控件深入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate之性能优化
- 下一篇: 即插即用+任意blur的超分辨率重建——