您的位置:首页 > 其它

Frame动画+按键监听(实现窗户打开关闭操作)

2011-04-24 22:46 465 查看
CurtainActivity 类:

实现当前Activity 窗户打开关闭操作

package temp.com;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
 
public class CurtainActivity extends Activity {
 
    private ImageView windowImageView;
    //当前操作的窗户 
    private int thisWindow=1;
    private CurtainOperationView curtainView;
    private Button okButton;
    private Button openButton;
    private Button closeButton;
    private Button returnButton;
    private Toast toast;
     
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.curtainview);
         
        final LinearLayout linearLayoutCurtain = (LinearLayout) findViewById(R.id.linearLayoutCurtain);
 
        // 获取窗户控件
        windowImageView = (ImageView) findViewById(R.id.windowImageView);
         
        //获取当前操作的窗户 
        getThisWindow();//返回当前窗户的ID 1表示左上、2表示右上、3表示左下、4表示右下
         
        // 设置窗户开始界面
        setWindowFace();  //curtain15 打开;curtain1 为关闭
         
        //根据窗帘的不同状态 设置动画
        setCurtainView(true);
         
 
        openButton = (Button) findViewById(R.id.openButton);
        openButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("监听到将要  打开窗户");
                if (!Values.windowIsOpen[thisWindow]) {
                    // 更新窗户状态
                    updateWindowState(true);
                    setCurtainView(false);// 建立并设置窗户动画显示方式curtainView
                    linearLayoutCurtain.removeAllViews();
                    linearLayoutCurtain.addView(curtainView);
                    curtainView.show(true);
                }else {                     
                    toast = Toast.makeText(getApplicationContext(),"窗户已经打开了!", Toast.LENGTH_LONG);
                           toast.setGravity(Gravity.CENTER, 0, 0);
                           toast.setDuration(400);
                           toast.show();
                }
            }
 
        });
 
        closeButton = (Button) findViewById(R.id.closeButton);
        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("监听到将要 关闭窗户");
                if (Values.windowIsOpen[thisWindow]) {
                    // 更新窗户状态
                    updateWindowState(false);
                    setCurtainView(true);// 建立并设置窗户动画显示方式curtainView         
                    linearLayoutCurtain.removeAllViews();
                    linearLayoutCurtain.addView(curtainView);
                    curtainView.show(true);
                }else {                     
                    toast = Toast.makeText(getApplicationContext(),
                             "窗户已经关上了!", Toast.LENGTH_LONG);
                           toast.setGravity(Gravity.CENTER, 0, 0);
                           toast.setDuration(400);
                           toast.show();
                }
            }
        });
 
        okButton = (Button) findViewById(R.id.okButton);
        okButton.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
                System.out.println("监听到确定按钮");
                if (curtainView != null) {
                    //finish();
                }
            }
 
        });
 
        returnButton = (Button) findViewById(R.id.returnButton);
        returnButton.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
                System.out.println("监听返回按钮");
                //finish();
            }
 
        });
    }
     
    //根据窗帘的不同状态 设置动画     
    //真 为开 假为闭
    public void setCurtainView(boolean isOpen) {
        curtainView = new CurtainOperationView(this, isOpen);
    }
 
    public void updateWindowState(boolean blean) {
        Values.windowIsOpen[thisWindow]=blean;         
    }
    //获取当前操作的窗户 
    //返回当前窗户的ID 1表示左上、2表示右上、3表示左下、4表示右下
    public int getThisWindow(){
        thisWindow=Values.thisWindow-1;
         
        System.out.println("This Window is "+thisWindow);
        if(Values.windowIsOpen[thisWindow])
            System.out.println("窗户已打开");
        else {
            System.out.println("窗户已关闭");
        };
        return thisWindow;
    }
    // 设置窗户开始界面
    //curtain15 打开;curtain1 为关闭
    public void setWindowFace(){
        if(Values.windowIsOpen[thisWindow])
            windowImageView.setImageResource(R.drawable.curtain15);
        else {
            windowImageView.setImageResource(R.drawable.curtain1);
        }
    }
 
     
}


CurtainOperationView 类:

package temp.com;
 
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.view.View;
 
public class CurtainOperationView extends View{
 
     
    /* 定义AnimationDrawable动画 */
    private AnimationDrawable    frameAnimation    = null;
    Context                        mContext        = null;
     
    /* 定义一个Drawable对象 */
    Drawable                mBitAnimation                = null;
    //
    public CurtainOperationView(Context context,boolean isOpen)
    {
        super(context);
         
        mContext = context;
         
        /* 实例化AnimationDrawable对象 */
        frameAnimation = new AnimationDrawable();
         
        /* 装载资源 */
        //这里用一个循环了装载所有名字类似的资源
        //如“curtain1.......15.png”的图片
         
        if(isOpen){//窗户为打开状态      这里是关闭动画
            for (int i = 15; i >= 1; i--)
            {
                int id = getResources().getIdentifier("curtain" + i, "drawable", mContext.getPackageName());
                mBitAnimation = getResources().getDrawable(id);
                /* 为动画添加一帧 */
                //参数mBitAnimation是该帧的图片
                //参数300是该帧显示的时间,按毫秒计算
                frameAnimation.addFrame(mBitAnimation, 300);
            }             
        }else if (!isOpen) {//窗户为关闭状态   这里是打开动画
            for (int i = 1; i <= 15; i++)
            {
                int id = getResources().getIdentifier("curtain" + i, "drawable", mContext.getPackageName());
                mBitAnimation = getResources().getDrawable(id);
                /* 为动画添加一帧 */
                //参数mBitAnimation是该帧的图片
                //参数500是该帧显示的时间,按毫秒计算
                frameAnimation.addFrame(mBitAnimation, 300);
            }             
        }
         
         
        /* 设置播放模式是否循环false表示循环而true表示不循环 */
        frameAnimation.setOneShot( true );  
         
        /* 设置本类将要显示这个动画 */
        this.setBackgroundDrawable(frameAnimation);         
         
    //    frameAnimation.setVisible(true, false);
        /* 开始播放动画 */
        frameAnimation.stop();
    }
     
    public void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
         
    }
     
    public void show(boolean ff)
    {
        if(ff)             
            /* 开始播放动画 */
            frameAnimation.start();
         
    }
 
}


Values 类:

package temp.com;

public class Values {
    public static int thisWindow=1;//当前操作的控件的ID    
    
    //对应九个窗帘,是否打开  true 表示窗帘是打开的     false 表示窗帘是关闭的
    public static boolean windowIsOpen[]={
                                            true,    //窗帘1
                                            true,    //窗帘2
                                            true,    //窗帘3
                                            true,    //窗帘4
                                            true,    //窗帘5
                                            true,    //窗帘6
                                            true,    //窗帘7
                                            true,    //窗帘8
                                            true    //窗帘9
                                        };
    
    
}
curtainview.xml 界面布局:

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

    <LinearLayout android:id="@+id/linearLayoutCurtain"
        android:layout_width="320dip" android:layout_height="320dip">
        <ImageView android:id="@+id/windowImageView"
            android:layout_width="320dip" 
            android:layout_height="320dip" />
    </LinearLayout>

    <RelativeLayout android:id="@+id/linearLayoutCurtainTheSecond"

        android:layout_width="wrap_content" android:layout_height="wrap_content">

        <Button android:id="@+id/openButton" android:layout_width="80dip"
            android:layout_height="wrap_content" android:text="打开窗户"

            android:layout_alignTop="@id/linearLayoutCurtainTheSecond"
            android:layout_alignLeft="@id/linearLayoutCurtainTheSecond" />

        <Button android:id="@+id/closeButton" android:layout_width="80dip"
            android:layout_height="wrap_content" android:text="关闭窗户"

            android:layout_toRightOf="@id/openButton" android:layout_alignTop="@id/linearLayoutCurtainTheSecond" />

        <Button android:id="@+id/okButton" android:layout_width="80dip"
            android:layout_height="wrap_content" android:text="确定"

            android:layout_toRightOf="@id/closeButton" android:layout_alignTop="@id/linearLayoutCurtainTheSecond" />

        <Button android:id="@+id/returnButton" android:layout_width="80dip"
            android:layout_height="wrap_content" android:text="返回"

            android:layout_toRightOf="@id/okButton" android:layout_alignTop="@id/linearLayoutCurtainTheSecond" />
    </RelativeLayout>
</LinearLayout>

    <!--
        android:layout_above 将该 控件放在给定ID之上 android:layout_below 之下
        android:layout_toLeftOf 本身的右边缘与另外的左边对齐 android:layout_toRightOf 左边 右边

        android:layout_alignBaseline baseline对齐 android:layout_alignBotton
        底部与底部对齐 android:layout_alignLeft 左边与左边对齐 android:layout_alignRight
        右边与右边对齐 android:layout_alignTop 顶部与顶部对齐

        android:layout_alignParentBottom 为真时,底部与父控件的底部对齐
        android:layout_alignParentLeft android:layout_alignParentRight
        android:layout_alignParentTop android:layout_centerHorizontal
        为真时,被置于水平方向中央 android:layout_centerInParent
        android:layout_centerVertical 为真时,被置于垂直方向中央
    -->


窗户打开时显示:



窗户正在关闭中显示:



窗户已关闭时显示:



//源码下载:(源码上传时丢失)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: