1. 程式人生 > >Android實現拖動效果的兩種解法

Android實現拖動效果的兩種解法

因為最近專案的需要,需要實現一個拖動效果,看了一下網上剛好有這種拖動效果的demo,程式碼大概如下:

 private void initListener(){
        screenWidth = getScreenWidth(this);//獲取螢幕寬度
        screenHeight = getScreenHeight(this) - getStatusHeight(MainActivity.this);//螢幕高度-狀態列
        testTv.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public
boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case
MotionEvent.ACTION_MOVE: int dx = (int) event.getRawX() - lastX; int dy = (int) event.getRawY() - lastY; int top = v.getTop() + dy; int left = v.getLeft() + dx; if (top <= 0
) { top = 0; } if (top >= screenHeight - testTv.getHeight() ) { top = screenHeight - testTv.getHeight(); } if (left >= screenWidth - testTv.getWidth()) { left = screenWidth - testTv.getWidth(); } if (left <= 0) { left = 0; } v.layout(left, top, left+v.getWidth(), top+v.getHeight()); v.postInvalidate(); lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_UP: break; } return true;//這裡根據專案需要選擇false與true } }); }

可是我的專案本身是有塗鴉的介面,還有很多複雜的事件,發現會有很奇怪的效果,抖動很厲害,而且時不時回到原來的位置,後來發現這個v.layout(left, top, left+v.getWidth(), top+v.getHeight());可能不適合專案的需求,所以我想了另一種解法。程式碼如下:

 private void initListener(){
        screenWidth = getScreenWidth(this);//獲取螢幕寬度
        screenHeight = getScreenHeight(this) - getStatusHeight(MainActivity.this);//螢幕高度-狀態列
        testTv.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {

                    case MotionEvent.ACTION_DOWN:
                        lastX = (int) event.getRawX();
                        lastY = (int) event.getRawY();
                        break;

                    case MotionEvent.ACTION_MOVE:
                        int dx = (int) event.getRawX() - lastX;
                        int dy = (int) event.getRawY() - lastY;

                        int top = v.getTop() + dy;


                        int left = v.getLeft() + dx;


                        if (top <= 0) {
                            top = 0;
                        }
                        if (top >= screenHeight - testTv.getHeight() ) {
                            top = screenHeight - testTv.getHeight();
                        }
                        if (left >= screenWidth - testTv.getWidth()) {
                            left = screenWidth - testTv.getWidth();
                        }

                        if (left <= 0) {
                            left = 0;
                        }

                        RelativeLayout.LayoutParams param = new RelativeLayout.LayoutParams(v.getWidth(), v.getHeight());
                        param.leftMargin = left;
                        param.topMargin = top;
                        v.setLayoutParams(param);
//                        v.layout(left, top, left+v.getWidth(), top+v.getHeight());

                        v.postInvalidate();

                        lastX = (int) event.getRawX();
                        lastY = (int) event.getRawY();

                break;
                case MotionEvent.ACTION_UP:
                break;

                }
                return true;
            }
        });
    }

效果如下圖:
這裡寫圖片描述
覺得可以了,不過要注意一些事項:鍵盤彈出需要自己處理一下(比如處理成彈出鍵盤就不能移動這些,不然會變形的),我覺得這種寫法可以應用於各種複雜的場景。好了,今天一些專案問題總結就到這裡了,希望對大家有幫助,程式碼也上傳了,地址如下:
http://download.csdn.net/detail/u013772458/9715171

相關推薦

Android實現效果解法

因為最近專案的需要,需要實現一個拖動效果,看了一下網上剛好有這種拖動效果的demo,程式碼大概如下: private void initListener(){ screenWidth = getScreenWidth(this);//獲取

laya用panel實現效果(拉地圖效果

layabox最常見的拖動效果是用list實現的,但是也可以用panel實現,並且,panel元件的功能之一就是用來實現拖動的,不存在說panel比list實現拖動更好。 用panel實現拖動時,需要給panel新增子容器,例如box,然後再往子容器box中新增想要滑動的內容,在box尺寸內

c# 實現用滑鼠沒有標題欄的視窗(窗體的任何部分都可實現效果)

上面形式的窗體,實現窗體的任何部分都可實現拖動 首先需要引入非託管程式碼,直接呼叫windows api         public const int WM_NCLBUTTONDOWN = 0xA1;         public const int HT_CAPT

easyui Draggable元件實現效果

Draggable是easyui中用於實現拖拽功能的一個外掛。利用它,我們可以實現控制元件的拖拽效果。Draggble覆蓋預設值$.fn.draggable.defaults。easyui做為一個封裝了JQusey的UI外掛,其實還是蠻好用的,至少省了像我這種渣渣很多時間。D

利用innerHTML實現隱顯效果-實現方法

        最近對JavaScript非常感興趣,可能因為是它和JAVA差不多吧。原來看到一些網頁上的隱顯效果,心理面真是佩服,心想自己能夠做就爽了。現在對innerHTML有一點的瞭解,做這個東西就相對簡單了,下面就是我自己弄來玩的一個例子,我相信你看了過後,如果你原來

Android實現音訊錄製的方式

package com.hb56.MyAndroidUtil; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.Dat

Android 自定義View(繼承原生元件)實現移位效果

自定義View實現拖拽移位效果 通過繼承GridLayout實現的拖拽移位效果 首先建立Class類繼承GridLayout並重寫前三個構造方法 public class MyGridlayout extends GridLayout implement

Android 自定義View(繼承原生元件)實現移位效果

自定義View實現拖拽移位效果 通過繼承GridLayout實現的拖拽移位效果 首先建立Class類繼承GridLayout並重寫前三個構造方法 public class MyGridlayout extends GridLayout implements

android縮放動畫的實現方法

get odi omx rac tor Coding eight rpo odin 在android開發。我們會常常使用到縮放動畫,普通情況下縮放動畫有兩種實現方式。一種是直接通過java代碼去實現,第二種是通過配置文件實現動畫,以下是兩種動畫的基本是用法: Ja

Android 仿 窗簾效果 和 登錄界面效果 (Scroller類的應用) 附 2個DEMO及源代碼

@override 宋體 off down != 過程 事件 學習 border 在android學習中,動作交互是軟件中重要的一部分。當中的Scroller就是提供了拖動效果的類,在網上。比方說一些Launcher實現滑屏都能夠通過這個類去實現。以下要說的

WPF 實現工具箱效果

get adding n) rgs 拖拽 value src 點擊 stroke 原文:WPF 實現拖動工具箱效果 1.效果 點擊左邊的矩形拖動到右邊canvas面板,右邊面板添加矩形 2.布局 左邊是個StockPanel,上面有個矩形,右

LeetCode 926. 將字串翻轉到單調遞增 遞迴實現動態規劃 解法

這個題做了一個多小時,考慮複雜了。 開始推動規沒有推出來,然後找到一個遞推關係:從左往右,如果是0,則不需要變動;如果是1,則有兩種選擇(1)將1變為0(2)將1後面的所有數字變為1,這兩種方法中的變動數字最小的方法就是最佳方法,然後依次遞推,很容易寫出遞迴程式。但是這裡面存

WPF 自定義窗體實現邊框改變窗體大小(2方法)

方式一:呼叫user32.dllAPI 這種方式在網上有很多,這裡只是按步驟重新建立一次。讀者只需要跟著做就行。 第一步:建立一個WPF專案:WpfResizeWithoutBorder,右鍵專案檔案---->新增----->資源字典,並命名為:WindowsResizeBord

Android 自定義View實現效果

騰訊QQ有那種紅點拖動效果,今天就來實現一個簡單的自定義View拖動效果,再回到原處,並非完全仿QQ紅點拖動 先來看一下效果圖 簡單說一下實現步驟 1.建立一個類繼承View 2.繪製出一個

2012-7-20 android 圖片疊加效果——方法

效果圖: 第一種: 第二種: 第一種是通過canvas畫出來的效果: public void first(View v) { // 防止出現Immutable bitmap passed to Canvas constructor錯誤

WindowManager實現懸浮可效果

現在360手機衛士有個流量統計的效果,開啟流量統計後,在桌面上會出現一個顯示流量的窗體,在任何介面都可以自由拖動。 模仿這個功能,做了一個統計手機訊號強度的Demo, 介面效果如下: 從上面的截圖可

table實現列寬的效果

部門有一個專案介面用的html,所有的列表都用的原生table控制元件,一個同事找到我問有沒有辦法實現table的列寬拖動,好幾年沒摸過前臺了,還真給問住了,經過網上查詢資料等,最終解決,記錄下: <!DOCTYPE html> &l

Android——自由並顯示文字的懸浮框實現

專案中需要實現一個狀態顯示的懸浮框,要求可以設定兩種模式:拖動模式和不可拖動模式。 實現效果圖如下: 實現步驟: 1.首先要設定該懸浮框的基本屬性: /** * 顯示彈出框 * * @param context */ @Su

js實現一個可以相容PC端和移動端的div效果

拖動時候用到的三個事件:mousedown、mousemove、mouseup在移動端都不起任何作用。 畢竟移動端是沒有滑鼠的,查資料後發現,在移動端與之相對應的分別是:touchstart、touc

[MFC] 無邊框視窗的Resize效果實現(下):子視窗覆蓋,導致主視窗熱點區無法響應WM_NCHITTEST

這篇博文講解了如何實現無邊框視窗的Resize拖動效果,文中提到,需要響應主視窗的WM_NCHITTEST訊息,檢測滑鼠是否在resize熱點區並返回HTTOPLEFT、HTBOTTOM等相應的結果。