老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

Android觸屏textview及listview對比驗證分析

這篇文章給大家介紹Android觸屏textview及listview對比驗證分析,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

創新互聯是一家集網站建設,中衛企業網站建設,中衛品牌網站建設,網站定制,中衛網站建設報價,網絡營銷,網絡優化,中衛網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。

觸摸屏做出動作已經成為主流手機的操作規范,但是你想過怎么開發觸摸屏手機的手勢操作嗎?本文將向各位介紹Android觸摸屏手機開發的textview及listview對比驗證。

View可以通過onTouchEvent收到觸摸屏幕事件

我們可以通過View.setOnTouchListener()設置事件監聽器

或者override onTouchEvent()來攔截這些事件

在攔截函數中判斷觸摸點的軌跡及運動速度就可以判斷出是什么手勢。

Android系統提供了GestureDetector來方便手勢的判斷,即:在攔截函數中每次touchevent都把事件作為參數調用GestureDetector.onTouchEvent(),當有手勢被識別出后,就會通知調用者。

為了能通知到調用者,GestureDetector在構造時要求傳入一個實現了OnGestureListener接口的對象,通過此對象就可以接收到各種手勢通知了。

首先,用textview來實驗:

用一個ViewFlipper放置兩個Textview,當手指在屏幕上左右移動時進行進行切換。

由于textview本身不會處理touchevent,而是會將其繼續上傳,所以textview布局時layout_width及layout_height沒有影響。

如果touch事件發生在textview上會繼續上傳到viewflipper;如果發生在viewflipper上那么就直接處理。

所以我們應該攔截發生在ViewFlipper上的touchEvent,并進行處理。

代碼如下,在onCreate中完成界面布局及事件攔截函數設置:

Java代碼

//創建一個ViewFlipper            mVf = new ViewFlipper(this);            //ViewFlipper打開長點擊支持。如果不打開,無法收到長時間點擊,那么手勢判斷就無從進行。            mVf.setLongClickable(true);            //攔截ViewFlipper的touch事件,并使用GestureDetector.onTouchEvent來處理            mVf.setOnTouchListener(new OnTouchListener() {                          @Override                public boolean onTouch(View v, MotionEvent event) {                    return mVfDetector.onTouchEvent(event);                }            });                        //添加一個textview。textview不能setLongClickable(true),            //如果設置了那么發生在textview上的touch事件就無法傳給viewflipper,            //無法被手勢識別對象處理了。            TextView tv = new TextView(this);            tv.setText("TextView 1");            tv.setBackgroundColor(0xffffffff); //設置一個白色背景,方便看到textview區域            mVf.addView(tv,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));                        //再添加一個textview            TextView tv2 = new TextView(this);            tv2.setText("TextView 2");            tv2.setBackgroundColor(0xffffffff);            mVf.addView(tv2,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));                               //將viewFlipper作為Activity的主view顯示            setContentView(mVf);

在監聽器中用到了GestureDetector對象,其是一個類成員對象,用如下代碼創建:

Java代碼

private GestureDetector mVfDetector = new GestureDetector(new OnGestureListener() {            //手指在屏幕上移動距離小于此值不會被認為是手勢            private static final int SWIPE_MIN_DISTANCE = 120;            //手指在屏幕上移動速度小于此值不會被認為手勢            private static final int SWIPE_THRESHOLD_VELOCITY = 200;                        //手勢識別函數,到此函數被系統回調時說明系統認為發生了手勢事件,            //我們可以做進一步判定。            @Override            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {                //如果第1個坐標點大于第二個坐標點,說明是向左滑動                //滑動距離以及滑動速度是額外判斷,可根據實際情況修改。                if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE &&     Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {                    //left                    Log.i("GestureDemo", "ViewFlipper left");                    mVf.showNext();                    return true;                }else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE &&     Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {                    //right                    Log.i("GestureDemo", "ViewFlipper right");                    mVf.showPrevious();                     return true;                }                return false;            }                    ... ...                    ... ...             });    }

我們將前文中添加第二個textview的改為添加Listview,代碼如下:

Java代碼

    ListView lv = new ListView(this);    lv.setBackgroundColor(0xff808080);    final String[] items = {"one", "two", "three"};    lv.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, items));    mVf.addView(lv,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

執行ap,滑動屏幕切換到第二屏,可以看到第二屏被換成了一個ListView,并且沒有填充完整個屏幕,這時如果在底部非ListView區域向左滑動,仍然可以切換到***屏,但是在Listview區域滑動就沒有效果了,因為touch事件被Listview處理了,ViewFlipper無法收到touch事件也就無法進行手勢判斷。

我們給ListView也增加一個touch事件監聽器,代碼如下:

Java代碼

    lv.setOnTouchListener(new OnTouchListener() {                   @Override        public boolean onTouch(View v, MotionEvent event) {            return mVfDetector.onTouchEvent(event);        }    });

此時在ListView上滑動也能實現屏幕切換了。

我們再給Listview增加響應點擊事件的處理,代碼如下:

Java代碼

    lv.setOnItemClickListener(new OnItemClickListener() {        @Override        public void onItemClick(AdapterView> arg0, View arg1,             int arg2, long arg3) {            new AlertDialog.Builder(MainActivity.this)                .setMessage(items[arg2])                .create()                .show();                        }    });

當點擊Listview的條目的時候,就會彈出窗口顯示點擊了哪一項,此時的代碼可參見附件1。

截止到此時,似乎Listview支持左右滑動的操作完成了,但實際上仍有兩個問題:

首先就是滑動時,Listview有時會有條目被高亮,這個問題倒還不是太嚴重。

再次就是ContextMenu每次滑動都會被激活,我們可以通過代碼驗證,創建ListView的代碼稍作修改:

Java代碼

    //使Listview長一些    final String[] items = {"one", "two", "three", "four", "five", "six", "sevent", "eight", "nine"};     registerForContextMenu(lv);

另外Activity的代碼增加:

Java代碼

@Override    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {            menu.add("Menu 1");            menu.add("Menu 2");            menu.add("Menu 3");        super.onCreateContextMenu(menu, v, menuInfo);    }

當我們在ListView的某一項上長按時就會彈出菜單,但是當滑動時,即使屏幕切換到了***屏,此菜單仍然會彈出。

為了解決上面的問題,我嘗試了以下辦法:

1.在ListView的touch事件監聽函數中始終返回true,吃掉所有事件,這樣的修改導致不能相應點擊,ListView不能上下滑動,此路不通。

2.在GestureDetector的fling函數中向ListView發送一個MotionEvent.ACTION_CANCEL事件,總是空指針異常,懷疑是因為touch事件沒有被ListView處理過,其內部成員狀態異常,于是我從ListView繼承實現了一個ListView,在onTouchEvent中呼叫super.onTouchEvent,但是發送MotionEvent.ACTION_CANCEL事件時仍然是空指針異常,再次失敗。

3.GestureDetector的onDown函數返回true,吃掉down事件,此時點擊時沒有高亮項了,切換時contextmenu也不被trigger了,但是長按也無法彈出contextmenu了。

為了能彈出contextMenu,那么就要在GestureDetector的onLongPress函數中調用ListView.showContextMenuForChild()來彈出菜單。

那么GestureDetector就與ViewFlipper的不通用了。

所以我重新由ListView繼承實現了一個類,這個類自身綁定了一個GestureDetector:

Java代碼

    @Override    public boolean onDown(MotionEvent e) {        return true;    //吃掉Down事件    }    @Override    public void onLongPress(MotionEvent e) {            System.out.println("Listview long press");        int position = pointToPosition((int)e.getX(), (int)e.getY());                       if( position != ListView.INVALID_POSITION) {            View child = getChildAt(position - getFirstVisiblePosition());            if(child != null) GestureListView.this.showContextMenuForChild(child);        }    }

另外為了能夠顯示contextmenu時在哪一項上激活的,在Activity增加函數:

Java代碼

@Override    public boolean onContextItemSelected(MenuItem item) {        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();        System.out.println("View " + info.position + " context menu activited.");        return super.onContextItemSelected(item);    }

從LogCat即可看到打印輸出。

此時此ListView可以響應手勢、可以響應點擊、可以彈出菜單,基本的功能已經滿足,另外再微調一下ondown函數,當點擊時可以高亮一下。

關于Android觸屏textview及listview對比驗證分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


網頁題目:Android觸屏textview及listview對比驗證分析
本文網址:http://www.xueling.net.cn/article/jgcpph.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 久99视频| 伊人蜜臀| www.se99午夜.com | 浪漫樱花动漫在线观看官网 | 伊色综合久久之综合久久 | 忘忧草在线影院www日本韩国 | 久久精品国产曰本波多野结衣 | 美女和帅哥在床上 | 日产乱码一二三区别免费麻豆 | 亚洲一区二区三区日韩 | 国产三级精品三级在线专1 午夜精品久久久久久久2023 | 国产亚洲精品成人AA片在线播 | 粗大的内捧猛烈进出欧美 | 无码AV中文一二三区 | 四虎成人精品 | 亚洲日本欧美天堂在线手机版 | 日本黄色片在线免费观看 | 天天摸夜夜添夜夜无码 | 亚洲精品TV久久久久久久久久 | 男人j捅女人p | 欧美一级毛片免费看 | 国产一区三区在线 | 中文字幕乱码亚洲影视 | 日韩欧美在线视频一区 | 日韩精品一区二区葵司亚洲91 | 国产偷窥真人视频在线观看 | 亚洲3级| 久久草av | 国产夫妻自拍小视频 | 日韩黄色片在线观看 | 久久观看免费视频 | 欧美第一在线视频 | 国产精品偷伦视频免费观看了 | 国产真实交换配乱淫视频 | caop在线 | 柠檬导航精品导航 | 在线观看国产v片 | 亚洲高清精品视频 | 日本一区二区三区免费高清 | a中文字幕解说在线 | 不卡一区在线 |