自定义的控件,继承自LinearLayout。在onLayout里面,重新计算了下各个子控件的位置,因为各组文字的scale是不一样的,必须重新Layout一下各个子控件的位置,是文字的显示区域和点击区域是一样的,这样给各个子控件设置的onClick事件才有效。
dispatchDraw方法是重绘各个子控件,更具各个子控件到中心控件的位置的距离,设置了各个TextView X方向的scale,为了就是看着要有一个立体的效果。
滑动之后,开始一个动画,动画结束之后重新requestLayout一下,重新计算下各个控件的位置。这个可以连续滑动的,如果这次动画在执行,会保存一下,等动画完了之后会接着跑下一个动画。各个子控件滑动距离的计算有兴趣的可以自己研究下,这里就不赘述了,其实也是数学知识。
1 package com.example.androidcustomnview;
2
3 import android.content.Context;
4 import android.graphics.Camera;
5 import android.graphics.Canvas;
6 import android.graphics.Color;
7 import android.graphics.LinearGradient;
8 import android.graphics.Matrix;
9 import android.graphics.Paint;
10 import android.graphics.Shader;
11 import android.os.Handler;
12 import android.os.Message;
13 import android.util.AttributeSet;
14 import android.util.Log;
15 import android.view.MotionEvent;
16 import android.view.View;
17 import android.view.WindowManager;
18 import android.view.animation.Animation;
19 import android.view.animation.Animation.AnimationListener;
20 import android.view.animation.TranslateAnimation;
21 import android.widget.LinearLayout;
22 import android.widget.TextView;
23
24 public class CustomViewL extends LinearLayout {
25
26 private static final String TAG = "CustomViewL.TAG";
27 private Matrix mMatrix;
28 Camera mCamera;
29 private int mCurrentItem = 2;
30 private int screenWidth;
31 private Paint mPaint;
32
33 public static final float ItemScale = 0.1f;
34
35 public CustomViewL(Context context) {
36 super(context);
37 // TODO Auto-generated constructor stub
38 initView(context);
39 }
40
41 public CustomViewL(Context context, AttributeSet attrs, int defStyleAttr,
42 int defStyleRes) {
43 super(context, attrs, defStyleAttr, defStyleRes);
44 initView(context);
45 }
46
47 public CustomViewL(Context context, AttributeSet attrs, int defStyleAttr) {
48 super(context, attrs, defStyleAttr);
49 initView(context);
50 }
51
52 public CustomViewL(Context context, AttributeSet attrs) {
53 super(context, attrs);
54 initView(context);
55 }
56
57 private void initView(Context context) {
60 screenWidth = ((WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE))
61 .getDefaultDisplay().getWidth();
63 }
64
65 @Override
66 protected void onLayout(boolean changed, int l, int t, int r, int b) {
67 Log.d(TAG, "onLayout ");
68 super.onLayout(changed, l , t, r, b);
69 View v = getChildAt(mCurrentItem);
70 int delta = getWidth() / 2 -