使用popupwindow自定义一个服务评价

来源:互联网 发布:我们相识网络里 编辑:程序博客网 时间:2024/06/03 20:19
昨天一哥们说要弄一个服务评价的popupwindow,可以实现通过选择几颗星以及可以编辑输入自己想输入的内容来进行评价,自己试了一下,可以完成。 最开始想用dialog来实现了,可是发现由于还有一个edittext控件在里面,所以如果dialog高度稍高一点,当输入法打开的时候dialog会跑到外面去,甚至把通知栏都盖住,效果非常不好,所以决定使用popupwindow来解决了!废话少说,先上布局文件(mainactivty):
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@drawable/bg_main"    >    <Button        android:id="@+id/button"        android:onClick="showPopUpWindow"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="点我出现pop"/></RelativeLayout>    popupwindow的布<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@android:color/transparent"    android:orientation="vertical">    <LinearLayout        android:id="@+id/ll_star_holder"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_marginRight="16dp"        android:layout_marginTop="16dp"        android:background="@drawable/bg"        android:orientation="vertical">        <LinearLayout            android:layout_width="match_parent"            android:layout_height="0dp"            android:layout_weight="3"            android:orientation="vertical"            android:weightSum="3">            <LinearLayout                android:layout_width="match_parent"                android:layout_height="0dp"                android:layout_marginLeft="10dp"                android:layout_marginRight="10dp"                android:layout_marginTop="10dp"                android:layout_weight="1"                android:orientation="horizontal">                <TextView                    android:layout_width="wrap_content"                    android:layout_height="match_parent"                    android:layout_marginRight="5dp"                    android:gravity="center"                    android:text="导航评价"                    android:textColor="@android:color/black"                    android:textSize="18sp" />                <LinearLayout                    android:id="@+id/ll_daohang"                    android:layout_width="match_parent"                    android:layout_height="match_parent"                    android:gravity="center"                    android:orientation="horizontal"                    android:weightSum="5"></LinearLayout>            </LinearLayout>            <LinearLayout                android:layout_width="match_parent"                android:layout_height="0dp"                android:layout_marginLeft="10dp"                android:layout_marginRight="10dp"                android:layout_marginTop="20dp"                android:layout_weight="1"                android:orientation="horizontal">                <TextView                    android:layout_width="wrap_content"                    android:layout_height="match_parent"                    android:layout_marginRight="5dp"                    android:gravity="center"                    android:text="效率评价"                    android:textColor="@android:color/black"                    android:textSize="18sp" />                <LinearLayout                    android:id="@+id/ll_xiaolv"                    android:layout_width="match_parent"                    android:layout_height="match_parent"                    android:gravity="center"                    android:orientation="horizontal"                    android:weightSum="5"></LinearLayout>            </LinearLayout>            <LinearLayout                android:layout_width="match_parent"                android:layout_height="0dp"                android:layout_marginBottom="10dp"                android:layout_marginLeft="10dp"                android:layout_marginRight="10dp"                android:layout_marginTop="20dp"                android:layout_weight="1"                android:orientation="horizontal">                <TextView                    android:layout_width="wrap_content"                    android:layout_height="match_parent"                    android:layout_marginRight="5dp"                    android:gravity="center"                    android:textColor="@android:color/black"                    android:text="服务评价"                    android:textSize="18sp" />                <LinearLayout                    android:id="@+id/ll_fuwu"                    android:layout_width="match_parent"                    android:layout_height="match_parent"                    android:gravity="center"                    android:orientation="horizontal"                    android:weightSum="5"></LinearLayout>            </LinearLayout>        </LinearLayout>        <EditText            android:id="@+id/custom_pingjia"            android:layout_width="match_parent"            android:layout_height="0dp"            android:layout_below="@+id/ll_star_holder"            android:layout_marginLeft="10dp"            android:layout_marginRight="10dp"            android:layout_weight="2"            android:gravity="top"            android:background="@null"            android:textColor="@android:color/darker_gray"            android:hint="请输入您对本次导航及作业的评价"            android:textSize="15sp" />        <TextView            android:id="@+id/certen"            android:layout_width="match_parent"            android:layout_height="0dp"            android:layout_gravity="center"            android:layout_marginBottom="10dp"            android:layout_marginLeft="25dp"            android:layout_marginRight="25dp"            android:layout_marginTop="10dp"            android:layout_weight="0.6"            android:background="@drawable/bg_text"            android:clickable="true"            android:gravity="center"            android:text="退出导航"            android:textColor="@android:color/white"            android:textSize="25sp" />    </LinearLayout>    <ImageView        android:id="@+id/iv_colse"        android:layout_width="32dp"        android:layout_height="32dp"        android:clickable="true"        android:layout_alignParentRight="true"        android:src="@drawable/icon_close" /></RelativeLayout>下面是程序代码:package ubi.com.popupwindowtext;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.drawable.ColorDrawable;import android.os.Bundle;import android.view.Display;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.PopupWindow;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {    private  int screenHeight;    private int screenWidth;    private LayoutInflater inflater;    private LinearLayout mDaoHang;    private LinearLayout mXiaoLv;    private LinearLayout mFuWu;    private EditText mCustomerPingjia;    private TextView mCerten;    private Button mButton;    private int widths;    private ImageView mIv_Close;    private PopupWindow popupWindow;    /**     * 以下三个参数为记录上一次点击导航评价,效率评价,服务评价星星的位置,初始化默认为-1     */    private int mPrePositonDaoHang=-1;    private int mPrePositionXiaoLv=-1;    private int mPrePositionFuWu=-1;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mButton= (Button) findViewById(R.id.button);        Display defaultDisplay = getWindowManager().getDefaultDisplay();        //得到屏幕的宽和高为了做到屏幕适配(此宽和高包括了通知栏的宽和高)        screenHeight=defaultDisplay.getHeight();        screenWidth=defaultDisplay.getWidth();        inflater=getLayoutInflater();    }    public void showPopUpWindow(View view){        popupWindow=new PopupWindow(this);        popupWindow.setFocusable(true);        popupWindow.setHeight(screenHeight / 2);        popupWindow.setWidth(screenWidth * 2 / 3);        View v=inflater.inflate(R.layout.layout_pop_upwindow,null);        mDaoHang= (LinearLayout) v.findViewById(R.id.ll_daohang);        mFuWu= (LinearLayout) v.findViewById(R.id.ll_fuwu);        mXiaoLv= (LinearLayout) v.findViewById(R.id.ll_xiaolv);        mIv_Close= (ImageView) v.findViewById(R.id.iv_colse);        mCustomerPingjia= (EditText) v.findViewById(R.id.custom_pingjia);        mCerten= (TextView) v.findViewById(R.id.certen);        mCerten.setOnClickListener(mCertenClickListener);        mIv_Close.setOnClickListener(mColseClickListener);        widths=mDaoHang.getWidth()/5;        initGrayStar(mDaoHang,mDaoHangStarCilckListener);        initGrayStar(mXiaoLv,mXiaoLvStarCilckListener);        initGrayStar(mFuWu, mFuWuStarCilckListener);        mDaoHang.setTag(true);        mXiaoLv.setTag(true);        mFuWu.setTag(true);        int width=screenWidth/20;        int height=screenHeight/4;        popupWindow.setContentView(v);//        这是设置popupwindow外屏幕的背景的//        WindowManager.LayoutParams lp = getWindow().getAttributes();//        lp.alpha = 0; //0.0-1.0//        getWindow().setAttributes(lp);        popupWindow.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.trasnlate)));        /**         * 这个方法是说将pop挂在那个控件之下面,基准点为所挂控件的左下角         */        //popupWindow.showAsDropDown(mButton,width,0);        /**         * 这个方法是以屏幕为控件放置的         */        popupWindow.showAtLocation(mButton, Gravity.TOP,width,height);    }    /*     *初始化添加灰色星星     */    private void initGrayStar(LinearLayout viewHolder,View.OnClickListener clickListener) {        for(int i=0;i<5;i++){            ImageView imageView=new ImageView(this);            imageView.setImageBitmap(getResBitmap(this, R.drawable.icon_star_gray));            imageView.setTag(i);            LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT,1);            imageView.setLayoutParams(params);            viewHolder.addView(imageView);            imageView.setOnClickListener(clickListener);        }    }    //导航评价星星的点击事件处理    private View.OnClickListener mDaoHangStarCilckListener=new View.OnClickListener() {        @Override        public void onClick(View v) {            changeStarState(mPrePositonDaoHang,(int) v.getTag(),mDaoHang);        }    };    //效率评价星星的点击事件处理    private View.OnClickListener mXiaoLvStarCilckListener=new View.OnClickListener() {        @Override        public void onClick(View v) {            changeStarState(mPrePositionXiaoLv,(int) v.getTag(),mXiaoLv);        }    };    //服务评价星星的点击事件处理    private View.OnClickListener mFuWuStarCilckListener=new View.OnClickListener() {        @Override        public void onClick(View v) {            changeStarState(mPrePositionFuWu, (int) v.getTag(), mFuWu);        }    };    //退出导航按钮的点击事件处理    private View.OnClickListener mCertenClickListener=new View.OnClickListener() {        @Override        public void onClick(View v) {            Toast.makeText(MainActivity.this,"点击了退出导航",Toast.LENGTH_SHORT).show();            dismissPop();        }    };    //右上角结束按钮的点击事件处理    private View.OnClickListener mColseClickListener=new View.OnClickListener() {        @Override        public void onClick(View v) {            dismissPop();        }    };    /**     * popupwindow消失     */    private void dismissPop() {        if(popupWindow!=null&&popupWindow.isShowing()){            popupWindow.dismiss();            popupWindow=null;            mPrePositonDaoHang=-1;            mPrePositionXiaoLv=-1;            mPrePositionFuWu=-1;        }    }    /**     * 如何高效率读取省内存的方式读取本地图片资源     */    private static BitmapFactory.Options bitmapFatoryOption;    public static Bitmap getResBitmap(Context context,int srcId){        if(bitmapFatoryOption ==null){           bitmapFatoryOption =new BitmapFactory.Options();            bitmapFatoryOption.inPreferredConfig=Bitmap.Config.RGB_565;            bitmapFatoryOption.inPurgeable=true;            bitmapFatoryOption.inInputShareable=true;        }        return BitmapFactory.decodeStream(context.getResources().openRawResource(srcId),null,bitmapFatoryOption);    }    /**     * 公共方法来改变点击星星的状态(此方法评价可以为全部灰色,如有其它要求可自行改变)     * @param prePosition     * @param position     * @param viewHolder     */    private void changeStarState(int prePosition,int position,LinearLayout viewHolder) {        //如果两次点击的位置相同,改变当前星星的状态        if(prePosition==position){            if((boolean)viewHolder.getTag()){                ((ImageView)viewHolder.getChildAt(position)).setImageBitmap(getResBitmap(MainActivity.this, R.drawable.icon_star_gray));                position--;            }else{                ((ImageView)viewHolder.getChildAt(position)).setImageBitmap(getResBitmap(MainActivity.this, R.drawable.icon_star_shine));                position++;            }        }else        //如果当下点击位置大于上一次点击的位置,则只需要设置点亮的星星即可        if(position>prePosition){            if(prePosition==-1){                prePosition=0;            }            for(int i=prePosition;i<=position;i++){                ((ImageView)viewHolder.getChildAt(i)).setImageBitmap(getResBitmap(MainActivity.this, R.drawable.icon_star_shine));            }            viewHolder.setTag(true);        }else{//只需要设置熄灭的星星即可            for(int i=position;i<=prePosition;i++){                ((ImageView)viewHolder.getChildAt(i)).setImageBitmap(getResBitmap(MainActivity.this, R.drawable.icon_star_gray));            }            viewHolder.setTag(false);        }        if(viewHolder==mDaoHang){            mPrePositonDaoHang=position;        }        if(viewHolder==mXiaoLv){            mPrePositionXiaoLv=position;        }        if(viewHolder==mFuWu){            mPrePositionFuWu=position;        }    }}最后是运行出来的效果图:![这里写图片描述](http://img.blog.csdn.net/20160319165342096)![这里写图片描述](http://img.blog.csdn.net/20160319165659929)![这里写图片描述](http://img.blog.csdn.net/20160319165716557)最后demo下载地址,希望对朋友有帮助:http://download.csdn.net/detail/zhq217217/9466596
0 0
原创粉丝点击