您的位置:首页 > 其它

ViewFlipper手势滑动改变标题和AsyncTask模拟的滑动菜单 ..

2014-05-28 16:33 381 查看

ViewFlipper手势滑动改变标题和AsyncTask模拟的滑动菜单 ...

crazyhl于 2013-11-5 10:06 发表在[Android实例] [复制链接][只看楼主][上一主题] [下一主题]这几天看了一些东西,一个通过按钮滑动的菜单和viewflipper。就想自己写点东西练习练习,可惜还是各种查询东西才得到的结果呢。下面是截图图片可以自动轮播,那些数字就是模拟的标题,会随着图片的轮播而变换,手势横向滑动也是可以的。显示那个button就是模拟的菜单,点击后,菜单就会滑动出来,再次点击就会收缩了。嗯,就是这样,代码都在MainActivity里面呢。下面就是代码了,最后项目在附件里面注释依然很全,谁都能看懂,因为我就菜,所以必须的注释清楚以后自己才能读懂,大神们欢迎指导啊。我要进步view sourceprint?
001
package
com.example.testlayout;
002
003
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;
022
023
public
class
MainActivity
extends
Activity
implements
OnGestureListener, OnTouchListener {
024
//菜单布局
025
private
RelativeLayout rl_menu;
026
//显示菜单按钮
027
private
Button btn_show_menu;
028
//菜单是否显示 true显示 false未显示
029
private
boolean
isShow;
030
//距离顶部的距离
031
private
int
topMargin;
032
//菜单布局参数
033
private
android.widget.FrameLayout.LayoutParams menuParams;
034
//viewFliper
035
private
ViewFlipper flipper;
036
//手势
037
private
GestureDetector mGestureDetector;
038
//手指滑动距离
039
private
static
final
int
FLING_MIN_DISTANCE =
80
;
040
//手指滑动速度
041
private
static
final
int
FLING_MIN_VELOCITY =
150
;
042
//当前显示的是第几个标题
043
private
int
currentTitle =
0
;
044
//测试用标题数组
045
private
String[] titleArr = {
"1111111111"
,
046
"2222222222"
,
047
"3333333333"
,
048
"4444444444"
,
049
"5555555555"
};
050
//标题控件
051
private
TextView tv_title;
052
//自定义动画监听器
053
private
MyAnimationListenermyAnimationListener;
054
@Override
055
protected
void
onCreate(Bundle savedInstanceState) {
056
super
.onCreate(savedInstanceState);
057
//设置布局
058
setContentView(R.layout.activity_main);
059
//找到各种控件
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();
064
//取得参数
065
topMargin = menuParams.topMargin;
066
//设置菜单是否显示为假
067
isShow =
false
;
068
//给按钮增加一个监听器
069
btn_show_menu.setOnClickListener(
new
View.OnClickListener() {
070
@Override
071
public
void
onClick(View v) {
072
// TODO Auto-generated method stub
073
//当按钮按下的时候执行一个AsyncTask
074
//其实这个东西意义不大,就是为了看起来好看一些而已
075
new
ScrollTask().execute(
5
);
076
}
077
});
078
flipper = (ViewFlipper) findViewById(R.id.viewFlipper1);
079
//注册一个用于手势识别的类
080
mGestureDetector =
new
GestureDetector(
this
);
081
//给flipper设置一个listener
082
flipper.setOnTouchListener(
this
);
083
//允许长按住ViewFlipper。这样才能识别拖动等手势
084
flipper.setLongClickable(
true
);
085
//设置自动轮播
086
flipper.setAutoStart(
true
);
087
//设置轮播时长
088
flipper.setFlipInterval(
5000
);
089
//设置开始动画
090
flipper.setInAnimation(inFromRightAnimation());
091
//设置结束动画
092
flipper.setOutAnimation(outToLeftAnimation());
093
//开始自动播放
094
flipper.startFlipping();
095
//动画监听器
096
myAnimationListener =
new
MyAnimationListener();
097
//在结束动画的时候设置监听器
098
flipper.getOutAnimation().setAnimationListener(myAnimationListener);
099
}
100
//自定义动画监听器类
101
class
MyAnimationListener
implements
AnimationListener{
102
103
@Override
104
public
void
onAnimationStart(Animation animation) {
105
// TODO Auto-generated method stub
106
 
107
}
108
//只有在动画结束的时候执行切换标题的动作,剩下的两个都不用弄
109
@Override
110
public
void
onAnimationEnd(Animation animation) {
111
// TODO Auto-generated method stub
112
currentTitle++;
113
if
(currentTitle > titleArr.length -
1
){
114
currentTitle =
0
;
115
}
116
tv_title.setText(titleArr[currentTitle]);
117
}
118
119
@Override
120
public
void
onAnimationRepeat(Animation animation) {
121
// TODO Auto-generated method stub
122
}
123
 
124
}
125
//自定义的滚动任务
126
class
ScrollTask
extends
AsyncTask<Integer, Integer, Integer>{
127
@Override
128
protected
Integer doInBackground(Integer... params) {
129
// TODO Auto-generated method stub
130
while
(
true
){
131
if
(isShow){
132
topMargin -=
1
;
133
if
(topMargin ==-dip2px(MainActivity.
this
,
20
)){
134
isShow =
false
;
135
break
;
136
}
137
}
else
{
138
topMargin +=
1
;
139
if
(topMargin ==
0
){
140
isShow =
true
;
141
break
;
142
}
143
}
144
publishProgress(topMargin);
145
sleep(params[
0
]);
146
}
147
return
topMargin;
148
}
149
@Override
150
protected
void
onProgressUpdate(Integer... topMargin) {
151
// TODO Auto-generated method stub
152
menuParams.topMargin = topMargin[
0
];
153
rl_menu.setLayoutParams(menuParams);
154
}
155
@Override
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);
161
}
162
}
163
//自定义的休眠方法,让菜单滑动开起来持续一些时间
164
private
void
sleep(
long
millis){
165
try
{
166
Thread.sleep(millis);
167
}
catch
(InterruptedException e){
168
e.printStackTrace();
169
}
170
}
171
/**
172
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
173
*/
174
public
static
int
dip2px(Context context, 
float
dpValue) {
175
  
final
float
scale = context.getResources().getDisplayMetrics().density;
176
  
return
(
int
) (dpValue * scale +
0
.5f);
177
}
178
179
/**
180
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
181
*/
182
public
static
int
px2dip(Context context, 
float
pxValue) {
183
  
final
float
scale = context.getResources().getDisplayMetrics().density;
184
  
return
(
int
) (pxValue / scale +
0
.5f);
185
}
186
 
187
/**
188
 
* 定义从左侧退出时的动画效果
189
 
* @return
190
 
*/
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());
199
 
200
return
inFromLeft;
201
}
202
/**
203
 
* 定义从右侧进入的动画效果
204
 
* @return
205
 
*/
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());
215
return
outtoLeft;
216
}
217
 
218
/**
219
 
* 定义从右侧退出时的动画效果
220
 
* @return
221
 
*/
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());
230
return
inFromLeft;
231
}
232
 
233
/**
234
 
* 定义从左侧进入的动画效果
235
 
* @return
236
 
*/
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());
246
return
outtoLeft;
247
}
248
 
249
250
@Override
251
public
boolean
onDown(MotionEvent e) {
252
// TODO Auto-generated method stub
253
return
false
;
254
}
255
@Override
256
public
void
onShowPress(MotionEvent e) {
257
// TODO Auto-generated method stub
258
 
259
}
260
@Override
261
public
boolean
onSingleTapUp(MotionEvent e) {
262
// TODO Auto-generated method stub
263
return
false
;
264
}
265
@Override
266
public
boolean
onScroll(MotionEvent e1, MotionEvent e2,
float
distanceX,
267
float
distanceY) {
268
// TODO Auto-generated method stub
269
return
false
;
270
}
271
@Override
272
public
void
onLongPress(MotionEvent e) {
273
// TODO Auto-generated method stub
274
 
275
}
276
/**
277
 
* 用户按下触摸屏,快速移动后松开既出发这个事件
278
 
* e1: 第一个ACTION_DOWN MotionEvent
279
 
* e2: 最后一个ACTION_MOVE MotionEvent
280
 
* velocityX: X轴上的移动速度,像素/秒
281
 
* velocityY: y轴上的移动速度,像素/秒
282
 
* 出发条件:
283
 
* x轴的坐标位移大于FLING_MIN_DISTANCE,且
284
 
* 移动速度大于FLING_MIN_VELOCITY个像素/秒
285
 
*/
286
@Override
287
public
boolean
onFling(MotionEvent e1, MotionEvent e2,
float
velocityX,
288
float
velocityY) {
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){
292
//当向左侧滑动的时候
293
//设置View进入屏幕时候使用的动画
294
flipper.setInAnimation(inFromRightAnimation());
295
//设置View退出屏幕的时候使用的动画
296
flipper.setOutAnimation(outToLeftAnimation());
297
flipper.showNext();
298
flipper.startFlipping();
299
currentTitle++;
300
if
(currentTitle > titleArr.length -
1
){
301
currentTitle =
0
;
302
}
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();
310
currentTitle--;
311
if
(currentTitle <
0
){
312
currentTitle =titleArr.length -
1
;
313
}
314
tv_title.setText(titleArr[currentTitle]);
315
}
316
//设置View进入屏幕时候使用的动画
317
flipper.setInAnimation(inFromRightAnimation());
318
//设置View退出屏幕的时候使用的动画
319
flipper.setOutAnimation(outToLeftAnimation());
320
flipper.startFlipping();
321
flipper.getOutAnimation().setAnimationListener(myAnimationListener);
322
return
false
;
323
}
324
@Override
325
public
boolean
onTouch(View v, MotionEvent event) {
326
// TODO Auto-generated method stub
327
flipper.stopFlipping();
328
// 一定要将触屏事件交给手势识别类去处理(自己处理会很麻烦的)
329
return
mGestureDetector.onTouchEvent(event);
330
}
331
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: