View基礎(chǔ)概念

View基礎(chǔ)概念

位置參數(shù)

  • top务漩、left瓢阴、right夏志、bottom
    大小均是基于父容器的左或上的距離咐蚯,由此可計算View自身的寬高
  • translationX童漩、translationY
    Android3.0后新增加的,相對父容器的偏移量春锋,屬性動畫改變的就是這類的參數(shù)

通過get/set方法調(diào)用
View在平移過程中改變的是偏移量

MotionEvent相關(guān)方法

  • getX矫膨、getY
    相對于當(dāng)前View左上角的x、y坐標(biāo)

  • getRawX看疙、getRawY
    相對于手機(jī)屏幕左上角的x豆拨、y坐標(biāo)

  • ViewConfiguration
    // 獲取系統(tǒng)能識別的被認(rèn)為是滑動的最小距離
    ViewConfiguration.get(getContext()).getScaledTouchSlop();
    // 允許Fling手勢動作的最小值
    ViewConfiguration.get(getContext()).getScaledMinimumFlingVelocity();
    // 允許Fling手勢動作的最大值
    ViewConfiguration.get(getContext()).getScaledMaximumFlingVelocity();

  • GestureDetector
    手勢識別
    GestureDetector mGestureDetector = new GestureDetector(getApplicationContext(), this);
    // 解決長按屏幕無法拖動
    mGestureDetector.setIsLongpressEnabled(false);
    // 觸摸屏幕時
    @Override
    public boolean onDown(MotionEvent e) {
    return false;
    }

      // 手指在屏幕上按下,且未移動和松開時
      @Override
      public void onShowPress(MotionEvent e) {
    
      }
    
      // 點擊屏幕時
      @Override
      public boolean onSingleTapUp(MotionEvent e) {
          return false;
      }
    
      // 手指在屏幕上滾動時
      @Override
      public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
          return false;
      }
    
      // 手指長按時
      @Override
      public void onLongPress(MotionEvent e) {
    
      }
    
      // 手指快速滑動時,此時也會不斷調(diào)用onScroll
      @Override
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
          return false;
      }
    

Activity事件托管給GestureDetector
@Override
public boolean onTouchEvent(MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
View事件托管給GestureDetector
mButton.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
});

  • VelocityTracker
    速度追蹤
    if(mVelocityTracker == null){
    mVelocityTracker = VelocityTracker.obtain();
    }
    mVelocityTracker.addMovement(event);
    一段時間內(nèi)手指滑過的像素數(shù)能庆,下面是1000毫秒滑動的速度
    // 設(shè)置單位
    mVelocityTracker.computeCurrentVelocity(1000);
    // 獲取1秒內(nèi)x方向滑動像素
    int xVelocity = (int) mVelocityTracker.getXVelocity();
    重置和回收的方法
    mVelocityTracker.clear();
    mVelocityTracker.recycle();

View的滑動

按正常理解施禾,在屏幕坐標(biāo)系中,向右滑動為正搁胆,向左滑動為左

  • scrollTo/scrollBy
    Scroller滑動方式只能滑動內(nèi)容
    實際scrollTo/scrollBy滑動時相反
    View左邊緣在內(nèi)容的右邊時為正
    View上邊緣在內(nèi)容的下邊時為正
    Scroller mScroller = new Scroller(mContext);
    // 開始位置—>終點位置弥搞、時間
    mScroller.startScroll(getScrollX(), 0, dx, 0, 500);
    private void smoothScrollTo(int destX, int destY){
    int scrollX = getScrollX();
    int deltaX = destX - scrollX;
    // 滑動的位置-當(dāng)前位置就是1000ms內(nèi)滑動的距離
    mScroller.startScroll(scrollX, 0, deltaX, 0, 1000);
    invalidate();
    }
    @Override
    public void computeScroll(){
    if(mScroller.computeScrollOffset()){
    scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
    postInvalidate();
    }
    }

invalidate方法導(dǎo)致View重繪,draw方法會調(diào)用computeScroll方法
computeScrollOffset方法獲取scrollX和scrollY渠旁,就是當(dāng)前應(yīng)該滑動到的新位置
通過scrollTo方法來滑動
整個原理就是插值器通過通過時間流逝百分比計算出當(dāng)前屬性值改變百分比攀例,再通過估值器計算出改變后具體的屬性值
上面的過程就會實現(xiàn)彈性滑動,就是將一次大的滑動分成若干次小的滑動

  • 動畫
    ObjectAnimator.ofFloat(view, "translationX", 0, 100).setDuration(100).start();
  • LayoutParams布局參數(shù)
    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)button.getLayoutParams();
    params.width += 100;
    params.leftMargin += 100;
    // 兩種設(shè)置方式
    // button.setLayoutParams(params);
    // button.requestLayout();

View彈性滑動

  • Scroller
    使用Scroller顾腊,View普通滑動已經(jīng)總結(jié)了粤铭。主要是配合computeScroll方法的使用
  • 動畫
    動畫本身就具備這樣的功能,可以通過ObjectAnimator或ValueAnimator實現(xiàn)
    ValueAnimator animator = ValueAnimator.ofFloat(0, 1).setDuration(200);
    animator.addUpdateListener(new AnimatorUpdateListener(){
    @Override
    public void onAnimationUpdate(ValueAnimator animator){
    // 根據(jù)時間流逝得到值的百分比
    int fraction = (int)animator.getAnimatedFraction();
    mButton.scrollTo(startX + deltaX * fraction, 0);
    }
    });

動畫在這里只提供當(dāng)前值百分比計算杂靶,與Scroller類似

  • 延時實現(xiàn)分段滑動
    比如距離100像素梆惯,時間1000毫秒酱鸭,分30次小的滑動,每次滑動延時30毫秒
    private View view;
    private int mCount = 0;
    Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
    mCount++;
    if(mCount <= 30){
    // 分30次垛吗,計算每次移動的位置
    float fraction = mCount/30.0f;
    int scrollX = (int) (fraction * 100);
    view.scrollTo(-scrollX, 0);
    handler.sendEmptyMessageDelayed(0, 30);
    }

          }
      };
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          view = findViewById(R.id.text_view);
          handler.sendEmptyMessageDelayed(0, 5000);
      }
    

這里scrollTo滑動的只是View的內(nèi)容凹髓,不是自身

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怯屉,隨后出現(xiàn)的幾起案子蔚舀,更是在濱河造成了極大的恐慌,老刑警劉巖锨络,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赌躺,死亡現(xiàn)場離奇詭異,居然都是意外死亡足删,警方通過查閱死者的電腦和手機(jī)寿谴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來失受,“玉大人讶泰,你說我怎么就攤上這事》鞯剑” “怎么了痪署?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長兄旬。 經(jīng)常有香客問我狼犯,道長,這世上最難降的妖魔是什么领铐? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任悯森,我火速辦了婚禮,結(jié)果婚禮上绪撵,老公的妹妹穿的比我還像新娘瓢姻。我一直安慰自己,他們只是感情好音诈,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布幻碱。 她就那樣靜靜地躺著,像睡著了一般细溅。 火紅的嫁衣襯著肌膚如雪褥傍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天喇聊,我揣著相機(jī)與錄音恍风,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛朋贬,可吹牛的內(nèi)容都是我干的鸥咖。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼兄世,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了啊研?” 一聲冷哼從身側(cè)響起御滩,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎党远,沒想到半個月后削解,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沟娱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年氛驮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片济似。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡矫废,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砰蠢,到底是詐尸還是另有隱情蓖扑,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布台舱,位于F島的核電站律杠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏竞惋。R本人自食惡果不足惜柜去,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拆宛。 院中可真熱鬧嗓奢,春花似錦、人聲如沸胰挑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞻颂。三九已至豺谈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贡这,已是汗流浹背茬末。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丽惭。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓击奶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親责掏。 傳聞我的和親對象是個殘疾皇子柜砾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容