电子商城(5)application类及视图类

Application

package com.tmall.view.base;

import android.app.Application;
import android.content.Context;
import android.content.res.Resources;
import android.widget.Toast;

public class BaseApplication extends Application {
    public static Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }

    static Toast mToast;

    public static void makeText(String text) {
        /*
         * if (mToast == null) mToast = new Toast(context);//? mToast.cancel();
         * mToast.setText(text); mToast.show();
         */
        makeText(text, Toast.LENGTH_LONG);
    }

    public static void makeText(String text, int time) {
        if (mToast != null)
            mToast.cancel();
        mToast = Toast.makeText(context, text, time);
        mToast.show();
    }

    public static Resources getRresource() {
        return getRresource();
    }

}

视图类

package com.tmall.view;

import org.apache.http.Header;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.example.tmall.R;
import com.loopj.android.http.RequestParams;
import com.tmall.common.CommonResult;
import com.tmall.net.CommonHttpHandler;
import com.tmall.net.HttpUtil;
import com.tmall.view.base.BaseApplication;

public class AccountActivity extends Activity implements OnClickListener {

    private OwlView mOwlView;
    private EditText etUserName;
    private EditText etPassword;
    private Button login;
    private String userName;
    private String password;

    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
        case R.id.account_btn_login:
            getDataFromHttp();
            break;
        case R.id.account_rv_regist:
            break;
        case R.id.account_tv_forget:

            break;
        default:
            break;
        }
    }

    private void getDataFromHttp() {
        userName = etUserName.getText().toString().trim();
        password = etPassword.getText().toString().trim();
        String url = HttpUtil.BASE_URL + "login";
        RequestParams params = new RequestParams();
        params.put("userName", userName);
        params.put("password", password);

        HttpUtil.post(url, params, new CommonHttpHandler() {

            @Override
            public void success(int arg0, Header[] arg1, byte[] bytes) {
                String result = new String(bytes);
                if ("ok".equals(result)) {// 登陆成功
                    BaseApplication.makeText("登陆成功");
                    AccountActivity.this.finish();
                    CommonResult.userName = userName;

                    skip();// 跳转到登陆成功的界面
                } else if ("fail".equals(result)) {// 登陆失败
                    // 提示登陆失败
                    BaseApplication.makeText("登陆失败,用户名或密码不正确");
                } else {// 网络连接不了等情况
                    BaseApplication.makeText("登陆异常");
                }
            }

        });
    }

    OnFocusChangeListener focusChangeListener = new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                mOwlView.open();
            } else {
                mOwlView.close();
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_account);
        findView();
        etPassword.setOnFocusChangeListener(focusChangeListener);
    }

    private void findView() {
        mOwlView = (OwlView) findViewById(R.id.owl_view);
        etUserName = (EditText) findViewById(R.id.username);
        etPassword = (EditText) findViewById(R.id.password);
        login = (Button) findViewById(R.id.account_btn_login);
        View title = findViewById(R.id.account_head);
        TextView tvTitle = (TextView) title.findViewById(R.id.head_tv_center);
        tvTitle.setText("用户登陆");
        login.setOnClickListener(this);

    }

    private void skip() {

    }

}
package com.tmall.view;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import android.widget.TextView;

import com.example.tmall.R;
import com.tmall.adapter.GridAdapter;

public class BrandFragment extends Fragment {

    private GridView gridView;

    private int[] ids;

    private String[] strs;

    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.brand_fragment, null);

        findView(view);

        setData();

        bindAdapter();

        return view;
    }

    private void bindAdapter() {
        GridAdapter adapter = new GridAdapter(ids, strs, getResources());
        gridView.setAdapter(adapter);
    }

    private void findView(View view) {
        gridView = (GridView) view.findViewById(R.id.brand_girdview);
        View title = view.findViewById(R.id.brand_head);
        TextView tvTitle = (TextView) title.findViewById(R.id.head_tv_center);
        tvTitle.setText("品牌中心");
    }

    private void setData() {
        ids = new int[] { R.drawable.semir, R.drawable.make, R.drawable.handu,
                R.drawable.eptition, R.drawable.beiyinm, R.drawable.iphone,
                R.drawable.only, R.drawable.dior, R.drawable.logitech };

        strs = new String[] { "森马", "马克华菲", "韩都衣舍", "衣品天成", "贝因美", "Iphone",
                "Only", "迪奥", "罗技" };

    }
}
package com.tmall.view;

import java.io.Serializable;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.Header;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import com.example.tmall.R;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.loopj.android.http.RequestParams;
import com.tmall.adapter.CarAdapter;
import com.tmall.bean.Car;
import com.tmall.bean.OrderItem;
import com.tmall.common.CommonResult;
import com.tmall.net.CommonHttpHandler;
import com.tmall.net.HttpUtil;

public class CarFragment extends Fragment {
    private ListView lvCar;

    private List<Car> carList;

    private CarAdapter adapter;

    private Button btnSum;

    OnClickListener listener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.car_btn_sum) {
                // 跳转界面和传递数据
                List<OrderItem> itemList = new ArrayList<OrderItem>();
                for (Car car : carList) {
                    OrderItem item = new OrderItem();
                    item.setPrice(car.getPrice());
                    item.setProCount(car.getProCount());
                    item.setProId(car.getProId());
                    item.setProUrl(car.getProUrl());
                    item.setTitle(car.getTitle());
                    itemList.add(item);
                }
                // 跳转界面
                skip(itemList);
            }
        }

        private void skip(List<OrderItem> itemList) {
            Intent intent = new Intent();
            intent.setClass(getActivity(), OrderActivity.class);
            Bundle bundle = new Bundle();
            bundle.putSerializable("itemlist", (Serializable) itemList);
            intent.putExtra("cleanstyle", "carclean");
            intent.putExtras(bundle);
            startActivity(intent);
        }
    };

    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view;

        if (CommonResult.userName == null) {
            view = inflater.inflate(R.layout.car_fragment, null);
            setTitle(view);
        } else {
            view = inflater.inflate(R.layout.car_login_fragment, null);

            getHttpData();

            findView(view);

            bindAdapter();

        }

        return view;
    }

    private void findView(View view) {
        lvCar = (ListView) view.findViewById(R.id.car_login_lv);
        btnSum = (Button) view.findViewById(R.id.car_btn_sum);
        btnSum.setOnClickListener(listener);
        setTitle(view);
    }

    private void setTitle(View view) {
        // 找到头部组件
        View title = view.findViewById(R.id.car_head);
        TextView tvTitle = (TextView) title.findViewById(R.id.head_tv_center);
        tvTitle.setText("购物车");
    }

    private void bindAdapter() {
        adapter = new CarAdapter(carList);
        lvCar.setAdapter(adapter);
    }

    private void getHttpData() {
        String url = HttpUtil.BASE_URL + "car";
        RequestParams params = new RequestParams();
        params.put("userName", CommonResult.userName);

        HttpUtil.post(url, params, new CommonHttpHandler() {

            @Override
            public void success(int arg0, Header[] arg1, byte[] bytes) {
                String json = new String(bytes);

                try {
                    JSONObject jsonObject = new JSONObject(json);
                    String result = jsonObject.getString("result");
                    System.out.println(result);
                    String cars = jsonObject.getString("carList");

                    // gson转换list得到具体的值
                    Gson gson = new Gson();

                    Type t = new TypeToken<List<Car>>() {
                    }.getType();

                    carList = gson.fromJson(cars, t);

                    adapter.setData(carList);
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        });

    }

}
package com.tmall.view;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.Header;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.example.tmall.R;
import com.loopj.android.http.RequestParams;
import com.tmall.adapter.CenterListAdapter;
import com.tmall.adapter.HomeListAdapter;
import com.tmall.bean.CenterItem;
import com.tmall.common.CommonResult;
import com.tmall.net.CommonHttpHandler;
import com.tmall.net.HttpUtil;
import com.tmall.view.base.BaseApplication;

public class CenterFragMent extends Fragment {
    private List<CenterItem> topList;
    private List<CenterItem> bottomList;

    // private ImageView ivItemLeft;
    private TextView tvItem;
    private ImageView ivItemRight;
    private ListView lvTop;
    private ListView lvBottom;

    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.center_fragment, null);

        findView(view);// 找到制定的view组件

        // 搭建适配器
        bindAdapter();

        return view;

    }

    // 上层list的监听
    OnItemClickListener clickListener1 = new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            switch (position) {
            case 0:
                // 访问数据看看用户登陆状态决定跳转到哪个界面
                if (CommonResult.userName == null) {
                    Intent intent = new Intent();
                    intent.setClass(getActivity(), AccountActivity.class);
                    startActivity(intent);

                } else {
                    // 跳入另一个展示用户数据的界面
                }
                // 设置切换动画,从右边进入,左边退出,带动态效果
                getActivity().overridePendingTransition(R.anim.in_from_right,
                        R.anim.out_to_left);
                break;
            case 1:

                break;
            case 2:

                break;
            case 3:

                break;

            default:
                break;
            }

        }

    };
    // 下层list的监听
    OnItemClickListener clickListener2 = new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            switch (position) {
            case 0:

                break;
            case 1:

                break;
            case 2:

                break;

            default:
                break;
            }
        }
    };

    private void findView(View view) {
        lvTop = (ListView) view.findViewById(R.id.center_lv_top);
        lvBottom = (ListView) view.findViewById(R.id.center_lv_bottom);
        // ivItemLeft = (ImageView) view.findViewById(R.id.center_item_iv_left);
        // tvItem = (TextView) view.findViewById(R.id.center_item_tv);
        // ivItemRight = (ImageView)
        // view.findViewById(R.id.center_item_iv_right);
        View title = view.findViewById(R.id.center_head);
        TextView tvCenter = (TextView) title.findViewById(R.id.head_tv_center);
        tvCenter.setText("个人中心");

    }

    private void bindAdapter() {

        String[] topDatas = new String[] { "账户中心", "订单中心", "地址管理", "我的收藏" };
        int[] topIds = new int[] { R.drawable.account_center,
                R.drawable.order_center, R.drawable.address_manage,
                R.drawable.mycollect };
        // 加入实体类
        topList = new ArrayList<CenterItem>();
        for (int i = 0; i < topDatas.length; i++) {
            CenterItem item = new CenterItem();
            item.setIvLeftId(topIds[i]);
            item.setText(topDatas[i]);
            item.setIvRightId(R.drawable.go_next);
            topList.add(item);
        }

        // 上方的ListView绑定adapter数据
        CenterListAdapter listAdapter1 = new CenterListAdapter(topList);
        lvTop.setAdapter(listAdapter1);
        lvTop.setOnItemClickListener(clickListener1);

        String[] bottomDatas = new String[] { "帮助中心", "关于我们", "用户反馈" };
        int[] bottomIds = new int[] { R.drawable.help_center,
                R.drawable.about_us, R.drawable.return_back };
        // 加入实体类
        bottomList = new ArrayList<CenterItem>();
        for (int i = 0; i < bottomDatas.length; i++) {
            CenterItem item = new CenterItem();
            item.setIvLeftId(bottomIds[i]);
            item.setText(bottomDatas[i]);
            item.setIvRightId(R.drawable.go_next);
            bottomList.add(item);
        }

        CenterListAdapter listAdapter2 = new CenterListAdapter(bottomList);
        lvBottom.setAdapter(listAdapter2);
        lvBottom.setOnItemClickListener(clickListener2);

        // 下方分ListView绑定adapter数据
    }

}
package com.tmall.view;

import java.lang.reflect.Type;
import java.util.List;

import org.apache.http.Header;
import org.json.JSONObject;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import com.example.tmall.R;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.loopj.android.http.RequestParams;
import com.tmall.adapter.CommentAdapter;
import com.tmall.bean.Comments;
import com.tmall.net.CommonHttpHandler;
import com.tmall.net.HttpUtil;

public class CommentFragment extends Fragment {
    private int proId;

    private List<Comments> commentList;

    private ListView lvComment;

    public CommentFragment(int proId) {

        this.proId = proId;

        getHttpData();
    }

    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.comment_fragment, null);

        findView(view);

        bindAdapter();// 绑定适配器

        return view;
    }

    private void findView(View view) {
        lvComment = (ListView) view.findViewById(R.id.comment_lv);
    }

    private void bindAdapter() {
        CommentAdapter adapter = new CommentAdapter(commentList);
        lvComment.setAdapter(adapter);
    }

    private void getHttpData() {
        String url = HttpUtil.BASE_URL + "comments";
        RequestParams params = new RequestParams();
        params.put("proId", proId);

        HttpUtil.post(url, params, new CommonHttpHandler() {

            @Override
            public void success(int arg0, Header[] arg1, byte[] bytes) {
                try {
                    String json = new String(bytes);
                    JSONObject jsonObject = new JSONObject(json);
                    String comments = jsonObject.getString("comments");

                    Gson gson = new Gson();

                    Type t = new TypeToken<List<Comments>>() {
                    }.getType();

                    commentList = gson.fromJson(comments, t);

                    System.out.println(commentList);

                } catch (Exception e) {
                    e.printStackTrace();
                }

            }

        });

    }
}
package com.tmall.view;

import java.lang.reflect.Type;
import java.util.List;

import org.apache.http.Header;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import com.example.tmall.R;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.loopj.android.http.RequestParams;
import com.tmall.adapter.DetailListAdapter;
import com.tmall.bean.DetailImg;
import com.tmall.net.CommonHttpHandler;
import com.tmall.net.HttpUtil;

public class DetailFragment extends Fragment {

    private List<DetailImg> imgList;
    private int proId;
    private ListView lvDetail;
    private DetailListAdapter adapter;

    // 构造函数传进商品的id用来访问数据

    public DetailFragment(int proId) {
        this.proId = proId;
        httpData();// 访问网络请求获取所有详情图片数据

    }

    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.detail_fragment, null);

        findView(view);
        bindAdapter();// 绑定数据

        return view;
    }

    private void findView(View view) {
        lvDetail = (ListView) view.findViewById(R.id.detail_lv);
    }

    private void bindAdapter() {

        adapter = new DetailListAdapter(imgList);
        lvDetail.setAdapter(adapter);
    }

    private void httpData() {
        String url = HttpUtil.BASE_URL + "detailimg";
        RequestParams params = new RequestParams();
        params.put("proId", proId);
        HttpUtil.post(url, params, new CommonHttpHandler() {

            @Override
            public void success(int arg0, Header[] arg1, byte[] bs) {
                String json = new String(bs);

                try {
                    JSONObject object = new JSONObject(json);
                    String result = object.getString("result");
                    String imgs = object.getString("imgs");
                    Gson gson = new Gson();

                    Type type = new TypeToken<List<DetailImg>>() {
                    }.getType();
                    imgList = gson.fromJson(imgs, type);
                    adapter.setData(imgList);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        });
    }
}
package com.tmall.view;

import com.example.tmall.R;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.RadioButton;

public class HomeActivity extends FragmentActivity implements
        OnCheckedChangeListener {
    private HomeFragment homeFragment;
    private BrandFragment brandFragment;
    private CarFragment carFragment;
    private CenterFragMent centerFragMent;

    private FragmentManager fm;
    private FragmentTransaction transaction;

    private RadioButton rbHome;
    private RadioButton rbBrand;
    private RadioButton rbCar;
    private RadioButton rbCenter;

    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        setContentView(R.layout.activity_home);
        findView();
        init();
    }

    private void init() {
        // 创建4个fragment
        homeFragment = new HomeFragment();
        brandFragment = new BrandFragment();
        carFragment = new CarFragment();
        centerFragMent = new CenterFragMent();
        fm = getSupportFragmentManager();
        rbHome.setChecked(true);
    }

    private void findView() {
        rbHome = (RadioButton) findViewById(R.id.rbHome);
        rbHome.setOnCheckedChangeListener(this);
        rbBrand = (RadioButton) findViewById(R.id.rbBrand);
        rbBrand.setOnCheckedChangeListener(this);
        rbCar = (RadioButton) findViewById(R.id.rbCar);
        rbCar.setOnCheckedChangeListener(this);
        rbCenter = (RadioButton) findViewById(R.id.rbCenter);
        rbCenter.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        int id = buttonView.getId();
        switch (id) {
        case R.id.rbHome:
            if (rbHome.isChecked()) {
                transaction = fm.beginTransaction();
                homeFragment = null;
                homeFragment = new HomeFragment();

                transaction.replace(R.id.flContent, homeFragment);
                transaction.commit();

            }
            break;
        case R.id.rbBrand:
            if (rbBrand.isChecked()) {
                transaction = fm.beginTransaction();
                brandFragment = null;
                brandFragment = new BrandFragment();
                transaction.replace(R.id.flContent, brandFragment);
                transaction.commit();
            }

            break;
        case R.id.rbCar:
            if (rbCar.isChecked()) {
                transaction = fm.beginTransaction();
                carFragment = null;
                carFragment = new CarFragment();
                transaction.replace(R.id.flContent, carFragment);
                transaction.commit();
            }

            break;
        case R.id.rbCenter:
            if (rbCenter.isChecked()) {
                transaction = fm.beginTransaction();
                centerFragMent = null;
                centerFragMent = new CenterFragMent();
                transaction.replace(R.id.flContent, centerFragMent);
                transaction.commit();
            }

            break;

        default:
            break;
        }
    }
}
package com.tmall.view;

import java.util.ArrayList;
import java.util.List;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

import com.example.tmall.R;
import com.tmall.adapter.HomeListAdapter;
import com.tmall.adapter.MyBaseAdapter;
import com.tmall.adapter.MyPageAdapter;
import com.tmall.bean.HomeItem;
import com.tmall.logic.MyPageChangeListener;
import com.tmall.view.base.BaseApplication;

public class HomeFragment extends Fragment {
    private final static int CHANGE_STATE = 0;// 改变状态

    private final static int KEEP_STATE = 1;// 保持状态

    private boolean isAutoPlay = true;

    private List<HomeItem> homeItemList;

    private ViewPager home_vp;

    private ListView home_lv;

    private View[] views;

    private int pagePosition = 0;

    private int[] pvDatas;

    private String[] strs;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.home_fragment, null);
        homeItemList = new ArrayList<HomeItem>();

        findView(view);

        setPageData();

        setListData();

        return view;
    }

    /**
     * 
     * @param view
     */
    private void findView(View view) {
        home_vp = (ViewPager) view.findViewById(R.id.home_vp);
        home_lv = (ListView) view.findViewById(R.id.home_lv);
        View view1 = view.findViewById(R.id.point1);
        View view2 = view.findViewById(R.id.point2);
        View view3 = view.findViewById(R.id.point3);
        View view4 = view.findViewById(R.id.point4);
        View view5 = view.findViewById(R.id.point5);
        views = new View[] { view1, view2, view3, view4, view5 };
    }

    /**
     * 设置page的数据和逻辑
     */
    private void setPageData() {
        // 设置pageView的数据并绑定到adapter上
        pvDatas = new int[] { R.drawable.image1, R.drawable.image2,
                R.drawable.image3, R.drawable.image4, R.drawable.image5 };
        MyPageAdapter pageAdapter = new MyPageAdapter(pvDatas, getResources());
        home_vp.setAdapter(pageAdapter);

        // 添加pagechange的监听
        MyPageChangeListener pageChangeListener = new MyPageChangeListener(
                views, this);

        home_vp.setOnPageChangeListener(pageChangeListener);

        pageThread.start();
    }

    /**
     * 设置底层listview的数据和逻辑
     */
    private void setListData() {
        // 设置listView的数据并绑定到adapter上
        int[] ivSignDatas = new int[] { R.drawable.home_classify_01,
                R.drawable.home_classify_02, R.drawable.home_classify_03,
                R.drawable.home_classify_04, R.drawable.home_classify_05 };
        strs = new String[] { "限时抢购", "促销快报", "新品上架", "热门单品", "推荐品牌" };

        for (int i = 0; i < 5; i++) {
            HomeItem homeItem = new HomeItem();
            homeItem.setIvSignId(ivSignDatas[i]);
            homeItem.setTvSign(strs[i]);
            homeItem.setIvSkipId(R.drawable.arrow);
            homeItemList.add(homeItem);
        }

        MyBaseAdapter<HomeItem> listAdapter = new HomeListAdapter(homeItemList);
        home_lv.setAdapter(listAdapter);
        home_lv.setOnItemClickListener(itemListenre);
    }

    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case CHANGE_STATE:
                int position = msg.arg1;
                home_vp.setCurrentItem(position);
                break;

            case KEEP_STATE:
                BaseApplication.makeText("出现问题,图片不能轮播");
                break;

            default:
                break;
            }
        };

    };

    Thread pageThread = new Thread() {
        public void run() {
            while (isAutoPlay) {
                try {
                    // System.out.println("位置为" + pagePosition);
                    sleep(3000);
                    if (pagePosition < pvDatas.length - 1) {
                        pagePosition += 1;
                    } else {
                        pagePosition = 0;
                    }
                    Message msg = Message.obtain();
                    msg.what = CHANGE_STATE;

                    msg.arg1 = pagePosition;

                    handler.sendMessage(msg);

                } catch (InterruptedException e) {
                    Message msg = Message.obtain();
                    msg.what = KEEP_STATE;
                    handler.sendMessage(msg);
                }

            }
        };
    };

    OnItemClickListener itemListenre = new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {

            // 限时抢购 跳转到限时抢购的页面
            Intent intent = new Intent();
            intent.setClass(getActivity(), ProductListActivity.class);
            intent.putExtra("state", position + 1);
            intent.putExtra("text", strs[position]);
            startActivity(intent);// 开启另一个activity

            // 设置切换动画,从右边进入,左边退出,带动态效果
            getActivity().overridePendingTransition(R.anim.in_from_right,
                    R.anim.out_to_left);

        }

    };

    @Override
    public void onPause() {
        super.onPause();
        isAutoPlay = false;
    }

    public boolean isAutoPlay() {
        return isAutoPlay;
    }

    public void setAutoPlay(boolean isAutoPlay) {
        this.isAutoPlay = isAutoPlay;
    }

    public int getPagePosition() {
        return pagePosition;
    }

    public void setPagePosition(int pagePosition) {
        this.pagePosition = pagePosition;
    }

    public ViewPager getHome_vp() {
        return home_vp;
    }

}
package com.tmall.view;

import java.util.ArrayList;

import org.apache.http.Header;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.example.tmall.R;
import com.loopj.android.http.RequestParams;
import com.tmall.adapter.OrderAdapter;
import com.tmall.bean.OrderItem;
import com.tmall.common.CommonResult;
import com.tmall.net.CommonHttpHandler;
import com.tmall.net.HttpUtil;
import com.tmall.view.base.BaseApplication;

public class OrderActivity extends Activity {

    private ArrayList<OrderItem> itemList = new ArrayList<OrderItem>();

    private MyListView lvOrder;// 订单列表

    private TextView tvName;// 收货人姓名

    private TextView tvNum;// 收货人手机号码

    private TextView tvAddress;// 收货人详细地址

    private TextView tvBuy;// 购买的点击按钮

    private TextView tvPrice;// 展示价格的textView

    private RelativeLayout adressLayout;// 地址那一块布局

    private String cleanSstyle;// 判定以哪种方式结算(购物车,直接购买)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order);

        getData();// 获取到上个界面跳转的数据

        findView();// 获取各个组件

        bindAdapter();// 绑定适配器

    }

    private int getTotalPrice() {
        int totalPrice = 0;
        for (OrderItem item : itemList) {
            totalPrice += item.getPrice() * item.getProCount();
        }
        return totalPrice;
    }

    private void findView() {
        adressLayout = (RelativeLayout) findViewById(R.id.order_address_layout);
        lvOrder = (MyListView) findViewById(R.id.order_lv);
        tvName = (TextView) findViewById(R.id.order_tv_name);
        tvNum = (TextView) findViewById(R.id.order_tv_num);
        tvAddress = (TextView) findViewById(R.id.order_tv_address);
        tvBuy = (TextView) findViewById(R.id.order_tv_buy);
        tvPrice = (TextView) findViewById(R.id.order_tv_price);
        tvBuy.setOnClickListener(onClickListener);
        adressLayout.setOnClickListener(onClickListener);
        View title = findViewById(R.id.order_head);
        TextView tvTitle = (TextView) title.findViewById(R.id.head_tv_center);
        tvTitle.setText("结算中心");

    }

    private void bindAdapter() {
        tvPrice.setText("¥" + String.valueOf(getTotalPrice()));
        OrderAdapter adapter = new OrderAdapter(itemList);
        lvOrder.setAdapter(adapter);
    }

    private void getData() {
        cleanSstyle = getIntent().getStringExtra("cleanstyle");

        itemList = (ArrayList<OrderItem>) getIntent().getSerializableExtra(
                "itemlist");
    }

    OnClickListener onClickListener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            switch (v.getId()) {

            case R.id.order_tv_buy:// 点击结算按钮
                // 从用户账户扣费发出请求

                System.out.println("发出了结算请求");
                requestHttp();

                break;

            default:
                break;
            }
        }

    };

    private void requestHttp() {
        String url = HttpUtil.BASE_URL + "clean";
        RequestParams params = new RequestParams();
        params.put("request", "cleanproduct");
        params.put("username", CommonResult.userName);
        params.put("cleanstyle", cleanSstyle);
        params.put("totalprice", getTotalPrice());

        HttpUtil.post(url, params, new CommonHttpHandler() {

            @Override
            public void success(int arg0, Header[] arg1, byte[] bytes) {
                String result = new String(bytes);

                System.out.println(result);
                if ("finish clean money".equals(result)) {
                    // 结算成功-跳转到结算成功的界面
                    Intent intent = new Intent();
                    intent.setClass(OrderActivity.this, SumOkActivity.class);
                    startActivity(intent);
                    OrderActivity.this.finish();
                    // 设置切换动画,从右边进入,左边退出,带动态效果
                    OrderActivity.this.overridePendingTransition(
                            R.anim.in_from_right, R.anim.out_to_left);

                } else if ("error clean money".equals(result)) {
                    // 结算过程中出错,未扣除用户资金,交易也没有达成

                    BaseApplication.makeText("余额不足");

                } else if ("money not enough".equals(result)) {
                    // 账户余额不足
                    Intent intent = new Intent();

                    intent.setClass(OrderActivity.this, SumFailActivity.class);

                    startActivity(intent);
                    OrderActivity.this.finish();
                    // 设置切换动画,从右边进入,左边退出,带动态效果
                    OrderActivity.this.overridePendingTransition(
                            R.anim.in_from_right, R.anim.out_to_left);
                    BaseApplication.makeText("余额不足");
                } else {
                    System.out.println("参数异常");
                }
            }
        });

    }
}
package com.tmall.view;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.Header;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

import com.example.tmall.R;
import com.google.gson.Gson;
import com.loopj.android.http.RequestParams;
import com.nineoldandroids.view.ViewPropertyAnimator;
import com.tmall.bean.Car;
import com.tmall.bean.OrderItem;
import com.tmall.bean.Product;
import com.tmall.common.CommonResult;
import com.tmall.net.CommonHttpHandler;
import com.tmall.net.HttpUtil;
import com.tmall.view.base.BaseApplication;

public class ProductActivity extends FragmentActivity {

    private int proId;// 商品的id
    private int sales;// 商品的销量
    private int price;// 商品的价格
    private String title;// 商品的标题
    private String cateGray;// 商品的运费类型
    private int lineWidth;// 下划线的长度

    private List<Fragment> fragments = new ArrayList<Fragment>();
    private List<TextView> tvHeadList;
    private ViewPager viewPager;
    private TextView tvPrdocut;
    private TextView tvComment;
    private TextView tvDetail;
    private View line;
    private Product product;
    private String imgUrl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_product);
        getValue();

        findView();// 找到组件

        setTvHeadList();// 加入tvList

        createFrames();// 创建fragment组

        setData();

    }

    private void getValue() {
        // 得到选定的商品id从而拿到商品详情
        Intent intent = getIntent();
        imgUrl = intent.getStringExtra("url");
        proId = intent.getIntExtra("proId", 1);
        sales = intent.getIntExtra("sales", 1);
        price = intent.getIntExtra("price", 1);
        title = intent.getStringExtra("title");
        cateGray = intent.getStringExtra("cateGray");

        product = new Product();
        product.setCateGray(cateGray);
        product.setId(proId);
        product.setPrice(price);
        product.setSales(sales);
        product.setTitle(title);
    }

    /**
     * 找到所有需要的组件并添加监听
     */
    private void findView() {
        viewPager = (ViewPager) findViewById(R.id.product_viewPager);
        line = (View) findViewById(R.id.line);
        // 上面的3个textview
        tvPrdocut = (TextView) findViewById(R.id.product_tv_pro);
        tvDetail = (TextView) findViewById(R.id.product_tv_detail);
        tvComment = (TextView) findViewById(R.id.product_tv_comment);
        // 下面的3个texxtview
        TextView tvCollect = (TextView) findViewById(R.id.product_tv_collect);
        TextView tvCar = (TextView) findViewById(R.id.product_tv_car);
        TextView tvBuy = (TextView) findViewById(R.id.product_tv_buy);
        // 添加监听
        tvCollect.setOnClickListener(clickListener);
        tvCar.setOnClickListener(clickListener);
        tvBuy.setOnClickListener(clickListener);
        tvPrdocut.setOnClickListener(clickListener);
        tvDetail.setOnClickListener(clickListener);
        tvComment.setOnClickListener(clickListener);
    }

    private void setTvHeadList() {
        tvHeadList = new ArrayList<TextView>();
        tvHeadList.add(tvPrdocut);
        tvHeadList.add(tvDetail);
        tvHeadList.add(tvComment);
    }

    private void createFrames() {
        ProductFragment productFragment = new ProductFragment(product);
        DetailFragment detailFragment = new DetailFragment(proId);
        CommentFragment commentFragment = new CommentFragment(proId);

        fragments.add(productFragment);
        fragments.add(detailFragment);
        fragments.add(commentFragment);

    }

    /**
     * 配置viewPager切换的效果和数据
     */
    private void setData() {
        // 得到下划线的长度并申请布局
        lineWidth = getWindowManager().getDefaultDisplay().getWidth()
                / (fragments.size() + 2);
        line.requestLayout();
        // 适配器配置数据
        viewPager.setAdapter(new FragmentPagerAdapter(
                getSupportFragmentManager()) {
            @Override
            public int getCount() {
                return fragments.size();
            }

            @Override
            public Fragment getItem(int position) {
                return fragments.get(position);
            }
        });

        viewPager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int state) {
                switch (state) {
                case 0:
                    changeState(tvPrdocut);
                    break;
                case 1:
                    changeState(tvDetail);
                    break;
                case 2:
                    changeState(tvComment);
                    break;
                default:
                    break;
                }
            }

            @Override
            // 这里控制底下滑动条滑动
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                float tagerX = arg0 * lineWidth + arg2 / (fragments.size() + 2);
                ViewPropertyAnimator.animate(line).translationX(tagerX)
                        .setDuration(0);
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });

    }

    OnClickListener clickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            int id = v.getId();
            switch (id) {
            case R.id.product_tv_pro:// 点击商品
                viewPager.setCurrentItem(0);
                break;
            case R.id.product_tv_detail:// 点击详情
                viewPager.setCurrentItem(1);
                break;
            case R.id.product_tv_comment:// 评论
                viewPager.setCurrentItem(2);
                break;

            case R.id.product_tv_collect:// 收藏

                break;
            case R.id.product_tv_car:// 购物车

                // 让用户先选择参数

                if (CommonResult.userName != null) {
                    updateCar();
                } else {
                    BaseApplication.makeText("请登陆账号");
                }

                break;
            case R.id.product_tv_buy:// 购买的时候
                if (CommonResult.userName != null) {
                    // 2.应该询问用户选择具体参数,这里由于时间问题摆在这里暂时不做,直接跳转到订单页面
                    skip();

                } else {
                    BaseApplication.makeText("请登录账号");
                }
                break;
            case R.id.product_iv_back:// 返回键

                break;

            default:
                break;
            }
        }

        private void skip() {
            Intent intent = new Intent();
            intent.setClass(ProductActivity.this, OrderActivity.class);

            OrderItem item = new OrderItem();
            item.setPrice(price);
            item.setTitle(title);
            item.setProUrl(imgUrl);
            item.setProCount(1);

            ArrayList<OrderItem> itemList = new ArrayList<OrderItem>();
            itemList.add(item);

            Bundle mbundle = new Bundle();
            mbundle.putSerializable("itemlist", (Serializable) itemList);
            intent.putExtra("cleanstyle", "productclean");
            intent.putExtras(mbundle);
            startActivity(intent);
        }
    };

    private void changeState(TextView tv) {
        for (TextView text : tvHeadList) {
            if (tv.getId() == text.getId()) {
                System.out.println(text.toString());
                text.setTextColor(getResources().getColor(R.color.red));
            } else {
                text.setTextColor(getResources().getColor(R.color.green));
            }
        }

    }

    private void updateCar() {
        String url = HttpUtil.BASE_URL + "updatecar";
        RequestParams params = new RequestParams();

        Car car = new Car();
        car.setUserName(CommonResult.userName);
        car.setPrice(price);
        car.setProCount(1);
        car.setProId(proId);
        car.setProUrl(imgUrl.substring(33));// 截取字符串

        // car.setProUrl(imgUrl.substring(32));

        car.setTitle(title);

        Gson gson = new Gson();
        String json = gson.toJson(car);

        params.put("request", "update");
        params.put("car", json);
        HttpUtil.post(url, params, new CommonHttpHandler() {

            @Override
            public void success(int arg0, Header[] arg1, byte[] bytes) {
                String result = new String(bytes);
                System.out.println("result==" + result);
                if ("ok".equals(result)) {
                    BaseApplication.makeText("已加入购物车");
                } else if ("fail".equals(result)) {
                    BaseApplication.makeText("加入购物车失败,购物车已存在该商品");
                } else {
                    BaseApplication.makeText("网络问题,请重新加载");
                }
            }
        });

    }
}
package com.tmall.view;

import java.lang.reflect.Type;
import java.util.List;

import org.apache.http.Header;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.tmall.R;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.loopj.android.http.RequestParams;
import com.tmall.adapter.ProductPageAdapter;
import com.tmall.bean.BigPic;
import com.tmall.bean.Product;
import com.tmall.net.CommonHttpHandler;
import com.tmall.net.HttpUtil;

public class ProductFragment extends Fragment {
    private Product product;
    private ViewPager proVp;
    private List<BigPic> bigPics;
    private ProductPageAdapter pageAdapter;
    private TextView tvTitle;
    private TextView tvPrice;
    private TextView tvCateGray;
    private TextView tvSales;

    // 构造函数传进商品id
    public ProductFragment(Product product) {
        this.product = product;

    }

    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.product_fragment, null);

        findView(view);// 找到id及添加监听操作

        bindAdapter();// pageView绑定adapter的操作

        manageData();// 处理其他textView等组件的数据展示

        // 在构造方法里调用保证异步加载操作只会访问一次网络获取所有数据
        gethttpDataPic();// 根据商品id访问网络获取数据

        return view;
    }

    private void manageData() {
        tvTitle.setText(product.getTitle());
        tvPrice.setText(String.valueOf(product.getPrice()));
        tvSales.setText("月销量:" + String.valueOf(product.getSales()));
        tvCateGray.setText(product.getCateGray());
    }

    private void bindAdapter() {

        pageAdapter = new ProductPageAdapter(bigPics);

        proVp.setAdapter(pageAdapter);
    }

    private void findView(View view) {
        proVp = (ViewPager) view.findViewById(R.id.pro_vp);
        tvTitle = (TextView) view.findViewById(R.id.pro_tv_title);
        tvPrice = (TextView) view.findViewById(R.id.pro_tv_price);
        tvCateGray = (TextView) view.findViewById(R.id.pro_tv_categray);
        tvSales = (TextView) view.findViewById(R.id.pro_tv_sales);

    }

    /**
     * 这里是异步线程控制的
     */
    private void gethttpDataPic() {

        // 执行网络访问操作
        String url = HttpUtil.BASE_URL + "bigpic";
        RequestParams params = new RequestParams();
        // 提交请求数据到服务器
        params.put("proId", product.getId());

        HttpUtil.post(url, params, new CommonHttpHandler() {
            @Override
            public void success(int arg0, Header[] arg1, byte[] bytes) {
                try {
                    /**
                     * 这里能拿到数据
                     */
                    String json = new String(bytes);

                    JSONObject jsonObject = new JSONObject(json);
                    String response = jsonObject.getString("response");
                    String picList = jsonObject.getString("picList");
                    // int listCount = jsonObject.getInt("listcount");
                    Gson gson = new Gson();
                    Type t = new TypeToken<List<BigPic>>() {
                    }.getType();
                    bigPics = gson.fromJson(picList, t);
                    // 提醒更新界面
                    pageAdapter.setData(bigPics);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }

}
package com.tmall.view;

import java.lang.reflect.Type;
import java.util.List;

import org.apache.http.Header;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;

import com.example.tmall.R;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.loopj.android.http.RequestParams;
import com.tmall.adapter.ProductListAdapter;
import com.tmall.bean.Product;
import com.tmall.net.CommonHttpHandler;
import com.tmall.net.HttpUtil;
import com.tmall.view.base.BaseApplication;

public class ProductListActivity extends Activity {

    private ListView proLv;

    // private EditText proEt;// 文本编辑框

    private List<Product> products;

    private ProductListAdapter adapter;

    private int state;
    private String text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_prolist);
        Intent intent = getIntent();
        state = intent.getIntExtra("state", 0);
        text = intent.getStringExtra("text");
        // 找到指定的view
        findView();
        // 获取网络请求
        getDataFromHttp();

        // 连接适配器
        setAdapter();

    }

    private void setAdapter() {

        adapter = new ProductListAdapter(ProductListActivity.this, products);
        proLv.setAdapter(adapter);
        proLv.setOnItemClickListener(clickListener);
        // proEt.setOnClickListener(onClickListener);

    }

    // 找到指定的view组件
    private void findView() {
        proLv = (ListView) findViewById(R.id.pro_list);
        View title = findViewById(R.id.prolist_head);
        TextView tvTitle = (TextView) findViewById(R.id.head_tv_center);
        tvTitle.setText(text);
    }

    private void getDataFromHttp() {

        String url = HttpUtil.BASE_URL + "limitbuy";
        RequestParams params = new RequestParams();
        params.put("state", state);

        HttpUtil.post(url, params, new CommonHttpHandler() {

            @Override
            public void success(int arg0, Header[] arg1, byte[] bs) {
                try {

                    // json解析
                    String json = new String(bs);
                    System.out.println(json);
                    if ("fail".equals(json)) {
                        BaseApplication.makeText("这一项没有商品");
                    } else {
                        JSONObject jsonObject = new JSONObject(json);
                        String response = jsonObject.getString("response");// 获取到返回的消息类型
                        if ("ok".equals(response)) {
                            String prolist = jsonObject.getString("prolist");// 获取到产品列表
                            Gson gson = new Gson();
                            Type t = new TypeToken<List<Product>>() {
                            }.getType();

                            products = gson.fromJson(prolist, t);

                            adapter.setData(products);
                        } else {
                            BaseApplication.makeText("当前网络环境问题");
                        }

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        });
    }

    OnItemClickListener clickListener = new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // 直接跳转到下一个界面
            // 这里所有点击统一处理跳到同样的界面不同的数据源

            Intent intent = new Intent();
            intent.putExtra("proId", products.get(position).getId());// 写出的数据id做甄别
            intent.putExtra("sales", products.get(position).getSales());
            intent.putExtra("price", products.get(position).getPrice());
            intent.putExtra("title", products.get(position).getTitle());
            intent.putExtra("cateGray", products.get(position).getCateGray());
            intent.putExtra("url", products.get(position).getImgUrl());

            intent.setClass(ProductListActivity.this, ProductActivity.class);
            startActivity(intent);
            // 设置切换动画,从右边进入,左边退出,带动态效果
            ProductListActivity.this.overridePendingTransition(
                    R.anim.in_from_right, R.anim.out_to_left);
        }
    };

}
package com.tmall.view;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;

import com.example.tmall.R;
import com.tmall.view.base.BaseApplication;

public class SumFailActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sumfail);
    }

    public void onClick(View v){
        if(v.getId()==R.id.sun_fail_btn){
            BaseApplication.makeText("我是穷逼我是穷逼");
        }
    }

}
package com.tmall.view;

import com.example.tmall.R;

import android.app.Activity;
import android.os.Bundle;

public class SumOkActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sunok);
    }
}

自定义控件类

package com.tmall.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ListView;

public class MyListView extends ListView {
    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    /**
     * 重写该方法,达到使ListView适应ScrollView的效果
     */
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = View.MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, View.MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}
package com.tmall.view;

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.animation.LinearInterpolator;

import java.math.BigDecimal;
import java.math.RoundingMode;

import com.example.tmall.R;

/**
 * Created by boobooL on 2016/4/19 0019
 * Created 邮箱 :boobooMX@163.com
 */

/**
 * 猫头鹰输入密码的时候捂住眼睛 布局文件中宽=175dp,height=107dp,也可以不写默认,只是为了预览
 */
public class OwlView extends View {
    private Context mContext;
    private Bitmap bm_owl;
    private Bitmap bm_owl_arm_left;
    private Bitmap bm_owl_arm_right;
    private int bm_height;
    private int moveHeight;
    private int alpha = 255;

    private int move_length = 0;
    private Paint handPaintBefore;
    private Paint handPaintAfter;

    public OwlView(Context context) {
        this(context, null);
    }

    public OwlView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public OwlView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext = context;
        init();
    }

    private void init() {
        setBackgroundColor(Color.TRANSPARENT);
        getViewTreeObserver().addOnGlobalLayoutListener(
                new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        getViewTreeObserver()
                                .removeGlobalOnLayoutListener(this);
                        ViewGroup.LayoutParams lp = getLayoutParams();
                        if (lp == null)
                            return;
                        lp.width = dip2px(175);
                        lp.height = dip2px(107);
                        setLayoutParams(lp);
                        setTranslationY(dip2px(9));
                    }
                });

        bm_owl = BitmapFactory.decodeResource(getResources(),
                R.drawable.owl_login);
        bm_owl_arm_left = BitmapFactory.decodeResource(getResources(),
                R.drawable.owl_login_arm_left);
        bm_owl_arm_right = BitmapFactory.decodeResource(getResources(),
                R.drawable.owl_login_arm_right);

        bm_owl = compressBitmap(bm_owl, dip2px(115), dip2px(107), false);
        bm_owl_arm_left = compressBitmap(bm_owl_arm_left, dip2px(40),
                dip2px(65), true);
        bm_owl_arm_right = compressBitmap(bm_owl_arm_right, dip2px(40),
                dip2px(65), true);

        bm_height = bm_owl_arm_left.getHeight() / 3 * 2 - dip2px(10);

        handPaintBefore = new Paint();
        handPaintBefore.setColor(Color.parseColor("#472d20"));
        handPaintBefore.setAntiAlias(true);

        handPaintAfter = new Paint();
        handPaintAfter.setAntiAlias(true);

    }

    public void close() {
        ValueAnimator alphaVa = ValueAnimator.ofInt(0, 255).setDuration(300);
        alphaVa.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                alpha = (Integer) animation.getAnimatedValue();
                invalidate();
            }
        });
        alphaVa.start();
        ValueAnimator moveVa = ValueAnimator.ofInt(dip2px(45), 0).setDuration(
                200);
        moveVa.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                move_length = (Integer) animation.getAnimatedValue();
                invalidate();
            }
        });
        moveVa.setStartDelay(200);
        moveVa.start();
        ValueAnimator va = ValueAnimator.ofInt(bm_height, 0).setDuration(300);
        va.setInterpolator(new LinearInterpolator());
        va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                moveHeight = (Integer) animation.getAnimatedValue();
                invalidate();
            }
        });
        va.start();
    }

    public void open() {
        final ValueAnimator alphaVa = ValueAnimator.ofInt(255, 0).setDuration(
                300);
        alphaVa.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                alpha = (Integer) animation.getAnimatedValue();
                invalidate();

            }
        });
        alphaVa.start();
        ValueAnimator moveVa = ValueAnimator.ofInt(0, dip2px(45)).setDuration(
                200);
        moveVa.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                move_length = (Integer) animation.getAnimatedValue();
                invalidate();
            }
        });
        moveVa.start();

        ValueAnimator va = ValueAnimator.ofInt(0, bm_height).setDuration(300);
        va.setInterpolator(new LinearInterpolator());
        va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                moveHeight = (Integer) animation.getAnimatedValue();
                invalidate();
            }
        });
        va.setStartDelay(100);
        va.start();

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(
                bm_owl,
                new Rect(0, 0, bm_owl.getWidth(), bm_owl.getHeight()),
                new Rect(dip2px(30), 0, dip2px(30) + bm_owl.getWidth(), bm_owl
                        .getHeight()), handPaintAfter);

        handPaintBefore.setAlpha(alpha);
        canvas.drawOval(new RectF(moveHeight, getHeight() - dip2px(20),
                move_length + dip2px(30), getHeight()), handPaintBefore);
        canvas.drawOval(
                new RectF(getWidth() - dip2px(30) - move_length, getHeight()
                        - dip2px(20), getWidth() - move_length, getHeight()),
                handPaintBefore);

        canvas.drawBitmap(bm_owl_arm_left,// Bitmap
                new Rect(0,// left
                        0,// top
                        bm_owl_arm_left.getWidth(),// right
                        moveHeight),// bottom
                new Rect(dip2px(43), getHeight() - moveHeight - dip2px(10),
                        dip2px(43) + bm_owl_arm_left.getWidth(), getHeight()
                                - dip2px(9)), handPaintAfter);// Paint
        // canvas.drawBitmap(Bitmap,Rect,Rect,Paint)
        canvas.drawBitmap(bm_owl_arm_right,// Bitmap
                new Rect(0,// left
                        0,// top
                        bm_owl_arm_right.getWidth(),// right
                        moveHeight),// bottom
                new Rect(getWidth() - dip2px(40) - bm_owl_arm_right.getWidth(),// left
                        getHeight() - moveHeight - dip2px(10),// top
                        getWidth() - dip2px(40),// right
                        getHeight() - dip2px(9)),// bottom
                handPaintAfter);// Paint
    }

    /**
     * 压缩图片
     * 
     * @param bitmap
     * @param reqsW
     * @param reqsH
     * @param isAdjust
     * @return
     */
    private Bitmap compressBitmap(Bitmap bitmap, int reqsW, int reqsH,
            boolean isAdjust) {
        if (bitmap == null || reqsW == 0 || reqsH == 0)
            return bitmap;
        if (bitmap.getWidth() > reqsW || bitmap.getHeight() > reqsH) {
            // TODO 有几个方法不是太明白
            /**
             * BigDecimal用法详解 一、简介
             * Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算
             * 。双精度浮点型变量double可以处理16位有效数
             * 。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算
             * ,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/
             * 等算术运算符直接对其对象进行数学运算
             * ,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法
             * ,专门用来创建对象,特别是带有参数的对象。 二、构造器描述 BigDecimal(int) 创建一个具有参数所指定整数值的对象。
             * BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 BigDecimal(long)
             * 创建一个具有参数所指定长整数值的对象。 BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
             * 
             * 三、方法描述 add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
             * subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
             * multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
             * divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。 toString()
             * 将BigDecimal对象的数值转换成字符串。 doubleValue() 将BigDecimal对象中的值以双精度数返回。
             * floatValue() 将BigDecimal对象中的值以单精度数返回。 longValue()
             * 将BigDecimal对象中的值以长整数返回。 intValue() 将BigDecimal对象中的值以整数返回。
             * 
             * 四、格式化及例子 由于NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,
             * 可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制。
             * 以利用BigDecimal对货币和百分比格式化为例
             * 。首先,创建BigDecimal对象,进行BigDecimal的算术运算后,分别建立对货币和百分比格式化的引用
             * ,最后利用BigDecimal对象作为format()方法的参数,输出其格式化的货币值和百分比。
             */
            float scaleX = new BigDecimal(reqsW).divide(
                    new BigDecimal(bitmap.getWidth()), 4, RoundingMode.DOWN)
                    .floatValue();
            float scaleY = new BigDecimal(reqsH).divide(
                    new BigDecimal(bitmap.getHeight()), 4, RoundingMode.DOWN)
                    .floatValue();
            if (isAdjust) {
                scaleX = scaleX < scaleY ? scaleX : scaleY;
                scaleY = scaleX;
            }
            // Matrix的作用是什么
            Matrix matrix = new Matrix();
            matrix.postScale(scaleX, scaleY);

            bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
                    bitmap.getHeight(), matrix, true);
        }
        return bitmap;
    }

    private int dip2px(int dpValue) {
        float scale = mContext.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值