我们基本上都见识过iphone的桌面启动器,我觉得很不错哦!
然后这次自己在做Android应用的时候,我就想做一个类似于那样的桌面启动器,然后就到处在网上看看,然后  总算弄了一个三栽版的:
下面啊的一个java类,基本上的动画以及走动都在里面了!


package cn.android.app;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.GradientDrawable.Orientation;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnTouchListener;
import android.widget.AbsoluteLayout;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * 
 * 这个项目,我做一做,看能不能完成,就是得到控件的坐标,然后移动
 * */

public class DotRotateActivity extends Activity {
    /** Called when the activity is first created. */
    private Button btn;
    /* 声明相关变量作为存储图片位置使用 */
    private int intDefaultX, intDefaultY;
    private float mX, mY;
    /* 声明存储屏幕的分辨率变量 */
    private int intScreenX, intScreenY;

    // 这里我来得到控件
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button) findViewById(R.id.btn);
        /* 取得屏幕对象 */
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);

        /* 取得屏幕解析像素 */
        intScreenX = dm.widthPixels;
        intScreenY = dm.heightPixels;
        // 调用背景颜色
        drawBackground();
        btn.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                System.out.println(" 这里是对按钮有效。。。look it....");
                // 调用这个方法,我们可以还原小球的位置
                // restoreBtn();
                return false;
            }
        });

    }

    // 实现点击事件
    // 定义一个变量,然后来统计次数
    private int count;

    public void onAction(View v) {
        switch (v.getId()) {
        case R.id.btn:
            count++;
            LinearLayout menu = (LinearLayout) findViewById(R.id.menu);
            if (count % 2 == 0) {
                System.out.println("原来在点击了两次哦!");
                menu.setVisibility(View.GONE);
            } else {
                System.out.println("呵呵,我只是单击了单次!");
                menu.setVisibility(View.VISIBLE);
            }
            // 得到gridview的实例
            myGridView = (GridView) menu.findViewById(R.id.gridview);

            // 这里创建一个绑定适配器的方法
            bindAdapter();
            break;
        case R.id.btn_two:
            System.out.println("dot me...");
            break;
        }

    }

    private GridView myGridView;

    private void bindAdapter() {
        MyCarAdapter adapter = new MyCarAdapter();
        myGridView.setAdapter(adapter);
    }

    // 自定义一个adapter,可以灵活的来控制gridview子控件的布局显示
    // 这是一个内部类
    class MyCarAdapter extends BaseAdapter {
        // 图片的索引id
        int[] img = { R.drawable.emoji_000, R.drawable.emoji_001,
                R.drawable.emoji_002, R.drawable.emoji_003 };

        // 再定义一个数组,然后与之对应
        String[] name = { "one", "two", "three", "four" };

        // 这里我们最好是重新写一下构造方法
        public MyCarAdapter() {

        }

        // 获取条目的数量
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return img.length;
        }

        // 返回子控件的内容
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return img[position];
        }

        // 获取子控件的id
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        // 重新加载view的方法
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            ImageView imageView = null;
            if (convertView == null) {

                // 通过layoutinflater类加载布局,返回一个view的实例对象
                convertView = LayoutInflater.from(DotRotateActivity.this)
                        .inflate(R.layout.main_view, null);
            }
            // 通过convertview调用findviewbyid方法根据其id返回相应的子控技
            imageView = (ImageView) convertView.findViewById(R.id.image);
            imageView.setImageResource(img[position]);
            TextView textview = (TextView) convertView
                    .findViewById(R.id.text_name);
            textview.setText(name[position]);

            return convertView;
        }

    }

    // 覆盖触控事件
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // TODO Auto-generated method stub
        /* 取得手指触控屏幕的位置 */
        float x = ev.getX();
        float y = ev.getY();

        try {
            /* 触控事件的处理 */
            switch (ev.getAction()) {
            /* 点击屏幕 */
            case MotionEvent.ACTION_DOWN:
                picMove(x, y);
                break;
            /* 移动位置 */
            case MotionEvent.ACTION_MOVE:
                picMove(x, y);
                break;
            /* 离开屏幕 */
            case MotionEvent.ACTION_UP:
                picMove(x, y);
                break;
            }
        } catch (Exception e) {
            // TODO: handle exception
        }

        return super.onTouchEvent(ev);

    }

    // // 还原btn的位置处理
    // private void restoreBtn() {
    //
    // intDefaultX = intScreenX - (btn.getWidth() / 2);
    // intDefaultY = intScreenY - (btn.getHeight() / 2);
    // System.out.println("this intDefaultX is " + intDefaultX
    // + "this intDefaultY is " + intDefaultY);
    // btn.setLayoutParams(new AbsoluteLayout.LayoutParams(btn.getWidth(), btn
    // .getHeight(), intDefaultX, intDefaultY));
    //
    // }

    // 这里我们添加一个移动的方法
    private void picMove(float x, float y) {

        // 默认微调图片与指针的相对位置
        mX = x - (btn.getWidth() / 2);
        mY = y - (btn.getHeight() / 2);
        if (mX + (btn.getWidth()) > intScreenX) {

            mX = intScreenX - btn.getWidth();
        } else if (mX < 0) {
            mX = 0;
        }
        System.out.println("this mx is " + mX + "this my is " + mY);
        btn.setLayoutParams(new AbsoluteLayout.LayoutParams(btn.getWidth(), btn
                .getHeight(), (int) mX, (int) mY));
    }

    // 加载背景颜色
    public void drawBackground() {
        GradientDrawable grad = new GradientDrawable(Orientation.TL_BR,
                new int[] { Color.rgb(0, 0, 127), Color.rgb(0, 0, 255),
                        Color.rgb(127, 0, 255), Color.rgb(0, 127, 255),
                        Color.rgb(127, 255, 255), Color.rgb(255, 127, 255) });
        this.getWindow().setBackgroundDrawable(grad);
    }

}


当然,这里也会有布局文件
第一个,就是点击按钮出来的布局:



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/menu"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#00000000"
    android:paddingBottom="2dip"
    android:layout_marginLeft="60dip"
    android:paddingTop="2dip"
    android:visibility="gone" >

    
    <GridView
        android:id="@+id/gridview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="150dip"
        android:numColumns="2"
        android:verticalSpacing="15dip" />

</LinearLayout>




然后还有主页的布局:



<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ball"
        android:onClick="onAction"
        />
        <Button
        android:id="@+id/btn_two"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="dot me"
        android:onClick="onAction"
        />
    
    <RelativeLayout
        android:id="@+id/layout_visible"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dip"
        android:layout_marginTop="100dip" 
    >

        <include layout="@layout/diy_menu" />
    </RelativeLayout>

</AbsoluteLayout>



最后还有一个布局:这个布局是布置点击按钮出来的布局里面然后加载的adapter里面的内容布局:



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- 在这个布局文件里面,我们主要是设置adapter里面的布局 -->

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="2dip" />

    <TextView
        android:id="@+id/text_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="" />

</LinearLayout>