crazyhl于 2013-11-5 10:06 发表在[Android实例]
[复制链接][只看楼主][上一主题] [下一主题]这几天看了一些东西,一个通过按钮滑动的菜单和viewflipper。就想自己写点东西练习练习,可惜还是各种查询东西才得到的结果呢。下面是截图图片可以自动轮播,那些数字就是模拟的标题,会随着图片的轮播而变换,手势横向滑动也是可以的。显示那个button就是模拟的菜单,点击后,菜单就会滑动出来,再次点击就会收缩了。嗯,就是这样,代码都在MainActivity里面呢。下面就是代码了,最后项目在附件里面注释依然很全,谁都能看懂,因为我就菜,所以必须的注释清楚以后自己才能读懂,大神们欢迎指导啊。我要进步
view sourceprint?001 | package com.example.testlayout; |
004 | import android.app.Activity; |
005 | import android.content.Context; |
006 | import android.os.AsyncTask; |
007 | import android.os.Bundle; |
008 | import android.util.Log; |
009 | import android.view.GestureDetector; |
010 | import android.view.GestureDetector.OnGestureListener; |
011 | import android.view.MotionEvent; |
012 | import android.view.View; |
013 | import android.view.View.OnTouchListener; |
014 | import android.view.animation.AccelerateInterpolator; |
015 | import android.view.animation.Animation; |
016 | import android.view.animation.Animation.AnimationListener; |
017 | import android.view.animation.TranslateAnimation; |
018 | import android.widget.Button; |
019 | import android.widget.RelativeLayout; |
020 | import android.widget.TextView; |
021 | import android.widget.ViewFlipper; |
023 | public class MainActivity extends Activity implements OnGestureListener, OnTouchListener { |
025 | private RelativeLayout rl_menu; |
027 | private Button btn_show_menu; |
028 | //菜单是否显示 true显示 false未显示 |
029 | private boolean isShow; |
033 | private android.widget.FrameLayout.LayoutParams menuParams; |
035 | private ViewFlipper flipper; |
037 | private GestureDetector mGestureDetector; |
039 | private static final int FLING_MIN_DISTANCE = 80 ; |
041 | private static final int FLING_MIN_VELOCITY = 150 ; |
043 | private int currentTitle = 0 ; |
045 | private String[] titleArr = { "1111111111" , |
051 | private TextView tv_title; |
053 | private MyAnimationListenermyAnimationListener; |
055 | protected void onCreate(Bundle savedInstanceState) { |
056 | super .onCreate(savedInstanceState); |
058 | setContentView(R.layout.activity_main); |
060 | tv_title = (TextView) findViewById(R.id.tv_title); |
061 | rl_menu = (RelativeLayout) findViewById(R.id.rl_menu); |
062 | btn_show_menu = (Button) findViewById(R.id.btn_show_menu); |
063 | menuParams = (android.widget.FrameLayout.LayoutParams) rl_menu.getLayoutParams(); |
065 | topMargin = menuParams.topMargin; |
069 | btn_show_menu.setOnClickListener( new View.OnClickListener() { |
071 | public void onClick(View v) { |
072 | // TODO Auto-generated method stub |
073 | //当按钮按下的时候执行一个AsyncTask |
074 | //其实这个东西意义不大,就是为了看起来好看一些而已 |
075 | new ScrollTask().execute( 5 ); |
078 | flipper = (ViewFlipper) findViewById(R.id.viewFlipper1); |
080 | mGestureDetector = new GestureDetector( this ); |
081 | //给flipper设置一个listener |
082 | flipper.setOnTouchListener( this ); |
083 | //允许长按住ViewFlipper。这样才能识别拖动等手势 |
084 | flipper.setLongClickable( true ); |
086 | flipper.setAutoStart( true ); |
088 | flipper.setFlipInterval( 5000 ); |
090 | flipper.setInAnimation(inFromRightAnimation()); |
092 | flipper.setOutAnimation(outToLeftAnimation()); |
094 | flipper.startFlipping(); |
096 | myAnimationListener = new MyAnimationListener(); |
098 | flipper.getOutAnimation().setAnimationListener(myAnimationListener); |
101 | class MyAnimationListener implements AnimationListener{ |
104 | public void onAnimationStart(Animation animation) { |
105 | // TODO Auto-generated method stub |
108 | //只有在动画结束的时候执行切换标题的动作,剩下的两个都不用弄 |
110 | public void onAnimationEnd(Animation animation) { |
111 | // TODO Auto-generated method stub |
113 | if (currentTitle > titleArr.length - 1 ){ |
116 | tv_title.setText(titleArr[currentTitle]); |
120 | public void onAnimationRepeat(Animation animation) { |
121 | // TODO Auto-generated method stub |
126 | class ScrollTask extends AsyncTask<Integer, Integer, Integer>{ |
128 | protected Integer doInBackground(Integer... params) { |
129 | // TODO Auto-generated method stub |
133 | if (topMargin ==-dip2px(MainActivity. this , 20 )){ |
144 | publishProgress(topMargin); |
150 | protected void onProgressUpdate(Integer... topMargin) { |
151 | // TODO Auto-generated method stub |
152 | menuParams.topMargin = topMargin[ 0 ]; |
153 | rl_menu.setLayoutParams(menuParams); |
156 | protected void onPostExecute(Integer topMargin) { |
157 | // TODO Auto-generated method stub |
158 | super .onPostExecute(topMargin); |
159 | menuParams.topMargin = topMargin; |
160 | rl_menu.setLayoutParams(menuParams); |
163 | //自定义的休眠方法,让菜单滑动开起来持续一些时间 |
164 | private void sleep( long millis){ |
167 | } catch (InterruptedException e){ |
172 | * 根据手机的分辨率从 dp 的单位 转成为 px(像素) |
174 | public static int dip2px(Context context, float dpValue) { |
175 | final float scale = context.getResources().getDisplayMetrics().density; |
176 | return ( int ) (dpValue * scale + 0 .5f); |
180 | * 根据手机的分辨率从 px(像素) 的单位 转成为 dp |
182 | public static int px2dip(Context context, float pxValue) { |
183 | final float scale = context.getResources().getDisplayMetrics().density; |
184 | return ( int ) (pxValue / scale + 0 .5f); |
191 | private Animation outToLeftAnimation() { |
192 | Animation inFromLeft = new TranslateAnimation( |
193 | Animation.RELATIVE_TO_PARENT, 0 .0f, |
194 | Animation.RELATIVE_TO_PARENT,- 1 .0f, |
195 | Animation.RELATIVE_TO_PARENT, 0 .0f, |
196 | Animation.RELATIVE_TO_PARENT, 0 .0f); |
197 | inFromLeft.setDuration( 500 ); |
198 | inFromLeft.setInterpolator( new AccelerateInterpolator()); |
206 | private Animation inFromRightAnimation() { |
207 | // TODO Auto-generated method stub |
208 | Animation outtoLeft = new TranslateAnimation( |
209 | Animation.RELATIVE_TO_PARENT, 1 .0f, |
210 | Animation.RELATIVE_TO_PARENT, 0 .0f, |
211 | Animation.RELATIVE_TO_PARENT, 0 .0f, |
212 | Animation.RELATIVE_TO_PARENT, 0 .0f); |
213 | outtoLeft.setDuration( 500 ); |
214 | outtoLeft.setInterpolator( new AccelerateInterpolator()); |
222 | private Animation outToRightAnimation() { |
223 | Animation inFromLeft = new TranslateAnimation( |
224 | Animation.RELATIVE_TO_PARENT, 0 .0f, |
225 | Animation.RELATIVE_TO_PARENT, 1 .0f, |
226 | Animation.RELATIVE_TO_PARENT, 0 .0f, |
227 | Animation.RELATIVE_TO_PARENT, 0 .0f); |
228 | inFromLeft.setDuration( 500 ); |
229 | inFromLeft.setInterpolator( new AccelerateInterpolator()); |
237 | private Animation inFromLeftAnimation() { |
238 | // TODO Auto-generated method stub |
239 | Animation outtoLeft = new TranslateAnimation( |
240 | Animation.RELATIVE_TO_PARENT,- 1 .0f, |
241 | Animation.RELATIVE_TO_PARENT, 0 .0f, |
242 | Animation.RELATIVE_TO_PARENT, 0 .0f, |
243 | Animation.RELATIVE_TO_PARENT, 0 .0f); |
244 | outtoLeft.setDuration( 500 ); |
245 | outtoLeft.setInterpolator( new AccelerateInterpolator()); |
251 | public boolean onDown(MotionEvent e) { |
252 | // TODO Auto-generated method stub |
256 | public void onShowPress(MotionEvent e) { |
257 | // TODO Auto-generated method stub |
261 | public boolean onSingleTapUp(MotionEvent e) { |
262 | // TODO Auto-generated method stub |
266 | public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, |
268 | // TODO Auto-generated method stub |
272 | public void onLongPress(MotionEvent e) { |
273 | // TODO Auto-generated method stub |
277 | * 用户按下触摸屏,快速移动后松开既出发这个事件 |
278 | * e1: 第一个ACTION_DOWN MotionEvent |
279 | * e2: 最后一个ACTION_MOVE MotionEvent |
280 | * velocityX: X轴上的移动速度,像素/秒 |
281 | * velocityY: y轴上的移动速度,像素/秒 |
283 | * x轴的坐标位移大于FLING_MIN_DISTANCE,且 |
284 | * 移动速度大于FLING_MIN_VELOCITY个像素/秒 |
287 | public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, |
289 | // TODO Auto-generated method stub |
290 | Log.v( "AAAAA" , "e1=" +e1.getX()+ " e2=" +e2.getX()+ " e1-e2=" +(e1.getX()-e2.getX())); |
291 | if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY){ |
294 | flipper.setInAnimation(inFromRightAnimation()); |
296 | flipper.setOutAnimation(outToLeftAnimation()); |
298 | flipper.startFlipping(); |
300 | if (currentTitle > titleArr.length - 1 ){ |
303 | tv_title.setText(titleArr[currentTitle]); |
304 | } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE |
305 | && Math.abs(velocityX) > FLING_MIN_VELOCITY){ |
306 | flipper.setInAnimation(inFromLeftAnimation()); |
307 | flipper.setOutAnimation(outToRightAnimation()); |
308 | flipper.showPrevious(); |
309 | flipper.startFlipping(); |
312 | currentTitle =titleArr.length - 1 ; |
314 | tv_title.setText(titleArr[currentTitle]); |
317 | flipper.setInAnimation(inFromRightAnimation()); |
319 | flipper.setOutAnimation(outToLeftAnimation()); |
320 | flipper.startFlipping(); |
321 | flipper.getOutAnimation().setAnimationListener(myAnimationListener); |
325 | public boolean onTouch(View v, MotionEvent event) { |
326 | // TODO Auto-generated method stub |
327 | flipper.stopFlipping(); |
328 | // 一定要将触屏事件交给手势识别类去处理(自己处理会很麻烦的) |
329 | return mGestureDetector.onTouchEvent(event); |