新聞中心
本篇文章給大家分享的是有關(guān)怎么在Android應(yīng)用中利用onTouchEvent實(shí)現(xiàn)一個(gè)滑動(dòng)布局,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著小編一起來(lái)看看吧。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),東臺(tái)企業(yè)網(wǎng)站建設(shè),東臺(tái)品牌網(wǎng)站建設(shè),網(wǎng)站定制,東臺(tái)網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,東臺(tái)網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
1、boolean onTouch(View v, MotionVent event)
觸摸事件發(fā)送到視圖時(shí)調(diào)用(v:視圖,event:觸摸事件)
返回true:事件被完全消耗(即,從down事件開(kāi)始,觸發(fā)move,up所有的事件)
返回fasle:事件未被完全消耗(即,只會(huì)消耗掉down事件)
2、boolean onTouchEvent(MotionEvent event)
觸摸屏幕時(shí)調(diào)用
返回值,同上
須知
1、onTouch優(yōu)先級(jí)比onTouchEvent高
2、如果button設(shè)置了onTouchListener監(jiān)聽(tīng),onTouch方法返回了true,就不會(huì)調(diào)用這個(gè)button的Click事件
運(yùn)用onTouchEvent寫(xiě)一個(gè)能滑動(dòng)的布局
需求:
1.剛進(jìn)入界面外層布局,自動(dòng)下滑一段距離,露出內(nèi)層布局。
2.外層布局可以上下滑動(dòng),并且?guī)в型该鞫葷u變效果,改變內(nèi)邊距效果。
需求分析:
1.顯然,外層布局要默認(rèn)覆蓋內(nèi)層布局了,這個(gè)容易。自動(dòng)下滑,要用到動(dòng)畫(huà),ObjectAnimator
2.外層布局要實(shí)現(xiàn)上下滑動(dòng),那么需要自定義,對(duì)onTouchEvent重寫(xiě)(核心邏輯)
代碼如下:
/** * Author:Biligle. * 自定義布局 */ public class MyViewGroup extends ViewGroup { private MyViewGroupListener listener;//接口,監(jiān)聽(tīng)滑動(dòng)事件 private int vertical = 0;//布局距離頂端距離(默認(rèn)0) public MyViewGroup(Context context) { super(context); } public MyViewGroup(Context context, AttributeSet attrs) { super(context, attrs); } public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } private int downY = 0;//按下時(shí)的點(diǎn) private int slide = 0;//最終移動(dòng)距離 @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: downY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: slide = downY - (int)event.getY(); if(slide < 0){//下滑 vertical = listener.marginTop(Math.abs(slide)); }else if(slide > 0){//上滑 vertical = listener.marginTop(-slide); } break; case MotionEvent.ACTION_UP: if(vertical < 300){ //布局距離屏幕頂部小于300,就讓布局充滿(mǎn)整個(gè)屏幕 vertical = listener.marginTop(0); } break; } return true; } /** * 測(cè)量子View * @param widthMeasureSpec * @param heightMeasureSpec */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); //系統(tǒng)測(cè)量 measureChild(child, widthMeasureSpec, heightMeasureSpec); } } /** * 安排子View的位置 * @param changed * @param l 左邊距 * @param t 上邊距 * @param r 右邊距 * @param b 下邊距 */ @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int left = 0, top = 0, right = 0, bottom = 0; for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); right = left + child.getMeasuredWidth(); bottom = top + child.getMeasuredHeight(); child.layout(left, top, right, bottom); } } public void setListener(MyViewGroupListener listener){ this.listener = listener; } interface MyViewGroupListener { /** * 設(shè)置topMargin,上下滑動(dòng)時(shí)觸發(fā) * @param slide 滑動(dòng)距離 * @return 當(dāng)前上邊距 */ int marginTop(int slide); } }
public class MainActivity extends AppCompatActivity implements MyViewGroup.MyViewGroupListener{ /** 自定義布局(外層布局)*/ private MyViewGroup myViewGroup; /** 兩個(gè)圓形圖(在外層布局)*/ private ImageView iv1,iv2/*,cloud*/; /** 包裹圓形圖的布局*/ private RelativeLayout relativeLayout; /** 外層布局參數(shù)類(lèi)(這里用到了params.topMargin:上邊距)*/ private ViewGroup.MarginLayoutParams params; /** 透明值(改變兩個(gè)圓圖的透明值)*/ private float f; /** 左右內(nèi)邊距(改變RelativeLayout內(nèi)邊距)*/ private int p; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myViewGroup = (MyViewGroup) findViewById(R.id.my); myViewGroup.setListener(this); iv1 = (ImageView) findViewById(R.id.iv1); iv2 = (ImageView) findViewById(R.id.iv2); relativeLayout = (RelativeLayout) findViewById(R.id.relative); params = (ViewGroup.MarginLayoutParams) myViewGroup.getLayoutParams(); //初始化動(dòng)畫(huà)(自動(dòng)下滑一段兒距離),我這里寫(xiě)死了900 ObjectAnimator animator = ObjectAnimator.ofFloat(myViewGroup,"translationY", 900); animator.setDuration(2000); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float y = (float)animation.getAnimatedValue(); f = y/800; p = (int) y/3; alpha(f); padding(p); } }); animator.start(); // cloud = (ImageView) findViewById(R.id.cloud); } /** * 設(shè)置上邊距 * @param slide 滑動(dòng)距離 * @return 返回下滑布局,距離屏幕左上角的垂直距離 */ @Override public int marginTop(int slide) { params.topMargin += slide; myViewGroup.setLayoutParams(params); int vertical = (900 + params.topMargin); if(slide == 0){ //為了隱藏兩張圓圖,所以把Relativelayout的高度一并減除。 params.topMargin -= (vertical+relativeLayout.getHeight()); myViewGroup.setLayoutParams(params); } float alpha = f + (float) params.topMargin/800;//自定義一個(gè)算法 alpha(alpha); int padding = p + params.topMargin/3;//自定義一個(gè)算法 padding(padding); return vertical; } /** * 設(shè)置透明度 * @param alpha 透明值 */ public void alpha(float alpha) { iv1.setAlpha(alpha); iv2.setAlpha(alpha); } /** * 設(shè)置左右邊距 * @param padding 邊距值 */ public void padding(int padding) { relativeLayout.setPadding(padding, 0, padding, 0); }
以上就是怎么在Android應(yīng)用中利用onTouchEvent實(shí)現(xiàn)一個(gè)滑動(dòng)布局,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站題目:怎么在Android應(yīng)用中利用onTouchEvent實(shí)現(xiàn)一個(gè)滑動(dòng)布局
路徑分享:http://www.dlmjj.cn/article/jhhdid.html