• 界面布局主要是通过listView来实现的,listView item 左右布局。左边是竖线,状态图片,竖线。右边 是 物流信息和 时间。开始左边线的高度很不好适配,最后请教网友,用了layout_weight属性。...



    界面布局主要是通过listView来实现的,listView item 左右布局。左边是竖线,状态图片,竖线。右边 是 物流信息和 时间。

    开始左边线的高度很不好适配,最后请教网友,用了layout_weight属性。

    竖线本来使用的是ImageView显示,结果线的高度变小,宽度也随之变小,导致屏幕根本看不清左边布局中状态图片上的线。

    最后采用了View来绘制竖线,效果还挺理想的额。

    具体的布局如下:

    [java] view plain copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout  
    3.        xmlns:android="http://schemas.android.com/apk/res/android"    
    4.        android:layout_width="fill_parent"    
    5.        android:layout_height="wrap_content"  
    6.        android:orientation="horizontal"  
    7.        >  
    8.       <LinearLayout   
    9.        android:layout_width="wrap_content"    
    10.        android:layout_height="fill_parent"  
    11.        android:layout_marginStart="10dip"   
    12.        android:orientation="vertical"  
    13.        android:gravity="center"  
    14.        >   
    15.         <View   
    16.             android:id="@+id/View_logistic_tracking_line1"  
    17.             android:layout_width="2dip"  
    18.             android:layout_height="20dip"     
    19.             android:background="#DCDCDC"/>  
    20.             <ImageView  
    21.             android:id="@+id/mgView_logistic_tracking_status"  
    22.             android:layout_width="wrap_content"    
    23.             android:layout_height="wrap_content"   
    24.             android:src="@drawable/logistics_state1"          
    25.             android:contentDescription="@string/app_name"  
    26.             />       
    27.        <View   
    28.             android:id="@+id/View_logistic_tracking_line2"  
    29.             android:layout_width="2dip"    
    30.             android:layout_height="0dip"  
    31.             android:layout_weight="1"  
    32.             android:background="#DCDCDC"/>  
    33.       </LinearLayout>  
    34.         <LinearLayout   
    35.            android:id="@+id/ll_logistic_tracking_timeline"  
    36.            android:layout_width="fill_parent"    
    37.            android:layout_height="wrap_content"  
    38.            android:layout_marginLeft="10dip"  
    39.            android:layout_marginRight="10dip"  
    40.            android:orientation="vertical"  
    41.        >  
    42.          <TextView   
    43.             android:id="@+id/tv_logistic_tracking_address"  
    44.             android:layout_width="match_parent"    
    45.             android:layout_height="wrap_content"   
    46.             android:layout_marginTop="20dip"  
    47.             android:textSize="20sp"  
    48.             android:textColor="#000000"  
    49.             />            
    50.        <TextView    
    51.             android:id="@+id/tv_logistic_tracking_time"    
    52.             android:layout_width="match_parent"     
    53.             android:layout_height="wrap_content"  
    54.             android:layout_marginTop="10dip"  
    55.             android:layout_marginBottom="20dip"  
    56.             android:textSize="18sp"  
    57.             android:textColor="#000000"  
    58.             />  
    59.       </LinearLayout>  
    60.   </LinearLayout>  


    自定义的适配器:

    [java] view plain copy
    1. public class TimeLineAdapter extends BaseAdapter {  
    2.   
    3.     private Context mcontext=null;  
    4.     private List<TimeLine> mlist=null;  
    5.     private LayoutInflater minflater;  
    6.       
    7.     public TimeLineAdapter ( Context context, List<TimeLine> list  ){  
    8.         this.mcontext = context;  
    9.         minflater = LayoutInflater.from(context);  
    10.         mlist = list;  
    11.     }  
    12.     @Override  
    13.     public int getCount() {  
    14.         // TODO Auto-generated method stub  
    15.         ifnull!=mlist){  
    16.             return mlist.size();  
    17.         }  
    18.         return 0;  
    19.     }  
    20.   
    21.     @Override  
    22.     public Object getItem(int position) {  
    23.         // TODO Auto-generated method stub  
    24.         ifnull!=mlist){  
    25.             return mlist.get(position);  
    26.          }  
    27.         return null;  
    28.     }  
    29.   
    30.     @Override  
    31.     public long getItemId(int position) {  
    32.         // TODO Auto-generated method stub  
    33.         return position;  
    34.     }  
    35.   
    36.     @SuppressLint("InflateParams")  
    37.     @Override  
    38.     public View getView(int position, View convertView, ViewGroup parent) {  
    39.         // TODO Auto-generated method stub    
    40.          ViewHold viewHold;  
    41.         if(convertView == null){  
    42.             viewHold = new ViewHold();  
    43.             convertView = minflater.inflate(R.layout.timeline_item, null);  
    44.             viewHold.imageView1 = (ImageView)convertView.findViewById(R.id.mgView_logistic_tracking_status);  
    45.             viewHold.textView1 = (TextView)convertView.findViewById(R.id.tv_logistic_tracking_address);  
    46.             viewHold.textView2 = (TextView)convertView.findViewById(R.id.tv_logistic_tracking_time);  
    47.             viewHold.line1 = (View)convertView.findViewById(R.id.View_logistic_tracking_line1);  
    48.             convertView.setTag(viewHold);  
    49.         }else {  
    50.             viewHold = (ViewHold)convertView.getTag( );  
    51.         }  
    52.         if(position==0){  
    53.             viewHold.line1.setVisibility(View.INVISIBLE);  
    54.             viewHold.imageView1.setImageResource(R.drawable.logistics_state);  
    55.         }else{  
    56.             viewHold.line1.setVisibility(View.VISIBLE);  
    57.             viewHold.imageView1.setImageResource(R.drawable.logistics_state1);  
    58.         }  
    59.         viewHold.textView1.setText( mlist.get(position).getMaddress());  
    60.         viewHold.textView2.setText( mlist.get(position).getMtime());  
    61.         return convertView;  
    62.     }  
    63.       
    64.   
    65.     private final static class ViewHold{  
    66.           
    67.         ImageView imageView1;  
    68.         View line1;  
    69.         TextView  textView1;  
    70.         TextView textView2;       
    71.     }  
    72. }  

    TimeLine定义:

    [java] view plain copy
    1. public class TimeLine {  
    2.   
    3.     private String  maddress;  
    4.     private String  mtime;  
    5.       
    6.     public TimeLine( String address ,String time){  
    7.   
    8.         this.maddress = address;  
    9.         this.mtime = time;  
    10.     }  
    11.   
    12.   
    13.     public String getMaddress() {  
    14.         return maddress;  
    15.     }  
    16.   
    17.     public void setMaddress(String maddress) {  
    18.         this.maddress = maddress;  
    19.     }  
    20.   
    21.     public String getMtime() {  
    22.         return mtime;  
    23.     }  
    24.   
    25.     public void setMtime(String mtime) {  
    26.         this.mtime = mtime;  
    27.     }  
    28. }  
    展开全文
  • 一、先在res下创建anim文件夹,里面创建两个xml,负责内容进出动画 ...set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="500"&gt;

    一、先在res下创建anim文件夹,里面创建两个xml,负责内容进出动画

    1. 近new_in.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500">
        <translate
            android:fromXDelta="0"
            android:fromYDelta="100%p"
            android:toXDelta="0"
            android:toYDelta="0" />
    </set>

    2. 出new_out.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500">
        <translate
            android:fromXDelta="0"
            android:fromYDelta="0"
            android:toXDelta="0"
            android:toYDelta="-100%p" />
    </set>

    二、文本内容旁边经常会有一个带有颜色的文本和背景,所以需要在drawable下创建一个样式shape.xml,你可选择添加

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <solid android:color="@android:color/white" />
        <stroke
            android:width="1dp"
            android:color="@android:color/holo_red_light" />
    
        <corners android:radius="3dp" />
    </shape>

    三、创建跑马灯中每条内容的布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:weightSum="2">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:padding="3dp">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/shape"
                android:paddingBottom="3dp"
                android:paddingLeft="5dp"
                android:paddingRight="5dp"
                android:paddingTop="3dp"
                android:text="热点"
                android:textColor="@android:color/holo_red_light" />
    
            <TextView
                android:id="@+id/tv_title1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:ellipsize="end"
                android:gravity="center_vertical"
                android:maxLines="1"
                android:paddingLeft="5dp" />
    
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/ll_second"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:padding="3dp">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/shape"
                android:paddingBottom="3dp"
                android:paddingLeft="5dp"
                android:paddingRight="5dp"
                android:paddingTop="3dp"
                android:text="热点"
                android:textColor="@android:color/holo_red_light" />
    
            <TextView
                android:id="@+id/tv_title2"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:ellipsize="end"
                android:gravity="center_vertical"
                android:maxLines="1"
                android:paddingLeft="5dp" />
    
        </LinearLayout>
    
    </LinearLayout>
    

    四、在使用的地方布局添加如下

    <ViewFlipper
            android:id="@+id/viewFlipper"
            android:layout_gravity="center_vertical"
            android:layout_width="match_parent"
            android:layout_height="50dp"/>

    五、控制跑马灯内容、滚动与停止

    public class MainActivity extends AppCompatActivity {
    
        private ViewFlipper viewFlipper;
        private List<String> titles;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
            initData();
            setViews();
        }
    
        private void initView() {
            viewFlipper = (ViewFlipper) findViewById(R.id.viewFlipper);
        }
    
        private void setViews() {
            if (titles.size() > 0) {
                //计算ViewFlipper视图的数目
                int viewNum = titles.size() / 2 + 1;
                for (int i = 0; i < viewNum; i++) {
                    //每一个视图的第一个新闻标题中集合中的下标值
                    final int position = i * 2;
                    View itemView = View.inflate(this, R.layout.title_view, null);
                    TextView tvTitle1 = (TextView) itemView.findViewById(R.id.tv_title1);
                    TextView tvTitle2 = (TextView) itemView.findViewById(R.id.tv_title2);
                    LinearLayout ll = (LinearLayout) itemView.findViewById(R.id.ll_second);
                    tvTitle1.setText(titles.get(position));
                    //判断第二行是否有数据
                    if (position + 1 < titles.size()) {
                        tvTitle2.setText(titles.get(position + 1));
                    } else {
                        //表示该视图的第二个标题没有数据,隐藏第二行布局
                        ll.setVisibility(View.GONE);
                    }
                    //标题1的点击事件
                    tvTitle1.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Toast.makeText(MainActivity.this, titles.get(position), Toast.LENGTH_SHORT).show();
                        }
                    });
                    //标题2的点击事件
                    tvTitle2.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Toast.makeText(MainActivity.this, titles.get(position + 1), Toast.LENGTH_SHORT).show();
                        }
                    });
                    viewFlipper.addView(itemView);
                }
                //视图进入动画
                viewFlipper.setInAnimation(this, R.anim.new_in);
                //视图退出动画
                viewFlipper.setOutAnimation(this, R.anim.new_out);
                //自动开始滚动
                viewFlipper.setAutoStart(true);
                //视图的切换间隔
                viewFlipper.setFlipInterval(3000);
    //            viewFlipper.startFlipping();//开始滚动
    //            viewFlipper.stopFlipping();//停止滚动
            }
        }
    
        private void initData() {
            titles = new ArrayList();
            titles.add("周一");
            titles.add("周二");
            titles.add("周三");
            titles.add("周四");
            titles.add("周五");
            titles.add("周六");
            titles.add("周七");
        }
    
    }
    

     

    展开全文
  • 最近在自学android, 想到平常手机通知栏经常能收到淘宝推送消息,可明明没有打开淘宝,后台中没有淘宝应用,那这种消息推送是怎么实现的呢
  • 如图 ![图片说明](https://img-ask.csdn.net/upload/201805/04/1525426405_883484.jpg)
  • 1、首先创建layout文件,代码如下:  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical" > ... android:layout_width="match_parent

    1、首先创建layout文件,代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <LinearLayout 
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#ff3390"
            >
            
        </LinearLayout>


        
        <LinearLayout
            android:id="@+id/testLl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:background="#eeead6"
         >
    <!-- 登录 -->
    <Button 
      android:id="@+id/mainNavbar_loginBt"
           android:layout_width="50dp"      
           android:layout_height="match_parent"
           android:layout_marginTop="10dp"
           android:layout_marginBottom="10dp"
           android:layout_marginLeft="5dp"
           android:layout_marginRight="5dp"
           android:textColor="#ffffff"
           android:textSize="14dp"
           android:gravity="center|center_horizontal"
           android:text="登录"
           />
    <ImageView
       android:id="@+id/mainNavbar_mmlIv" 
       android:layout_width="wrap_content"
       android:layout_height="match_parent"
       android:src="@drawable/menu_more_left"
       android:contentDescription="menu_more_left"/>
    <HorizontalScrollView
       android:id="@+id/mta_hsv" 
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_weight="8"
       android:overScrollMode="ifContentScrolls"
       android:scrollbars="none"
       android:fadingEdge="none"
       >
    <LinearLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:orientation="horizontal"
       android:background="#eeead6"
        >    
       <!-- 首页 -->
       <FrameLayout
           android:id="@+id/mta_syFl"
           android:layout_width="60dp"
          
        android:layout_height="wrap_content"
      >         
      <Button 
          android:id="@+id/mainNavbar_mainPageBt"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          
          android:text="首页"
          android:textSize="14dp"
          android:layout_gravity="center"
          android:gravity="center|center_horizontal"
          />
      <!-- android:text="@string/mainNavbar_mainPageBtTxt" -->
      <TextView 
          android:id="@+id/mainNavbar_mainPageNotifyTv"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          android:textSize="12dp"
          android:gravity="center"
          android:layout_gravity="top|right"
          android:textColor="#fff"
          
          android:visibility="gone"
          />
       </FrameLayout>
       
       <!-- 首页 -->
       <FrameLayout
           android:id="@+id/mta_sy1Fl"
           android:layout_width="60dp"
          
        android:layout_height="wrap_content"
      >  
      <Button 
          android:id="@+id/mainNavbar_mainPageBt"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          
          android:text="首页1"
          android:textSize="14dp"
          android:layout_gravity="center"
          android:gravity="center|center_horizontal"
          />
      <!-- android:text="@string/mainNavbar_mainPageBtTxt" -->
      <TextView 
          android:id="@+id/mainNavbar_mainPageNotifyTv"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          android:textSize="12dp"
          android:gravity="center"
          android:layout_gravity="top|right"
          android:textColor="#fff"
          
          android:visibility="gone"
          />
       </FrameLayout>
       
       <!-- 首页 -->
       <FrameLayout
           android:id="@+id/mta_sy2Fl"
           android:layout_width="60dp"
          
        android:layout_height="wrap_content"
      >         
      <Button 
          android:id="@+id/mainNavbar_mainPageBt"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          
          android:text="首页2"
          android:textSize="14dp"
          android:layout_gravity="center"
          android:gravity="center|center_horizontal"
          />
      <!-- android:text="@string/mainNavbar_mainPageBtTxt" -->
      <TextView 
          android:id="@+id/mainNavbar_mainPageNotifyTv"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          android:textSize="12dp"
          android:gravity="center"
          android:layout_gravity="top|right"
          android:textColor="#fff"
          
          android:visibility="gone"
          />
       </FrameLayout>
       
       <!-- 首页 -->
       <FrameLayout
           android:id="@+id/mta_sy3Fl"
           android:layout_width="60dp"
          
        android:layout_height="wrap_content"
      >  
      <Button 
          android:id="@+id/mainNavbar_mainPageBt"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          
          android:text="首页3"
          android:textSize="14dp"
          android:layout_gravity="center"
          android:gravity="center|center_horizontal"
          />
      <!-- android:text="@string/mainNavbar_mainPageBtTxt" -->
      <TextView 
          android:id="@+id/mainNavbar_mainPageNotifyTv"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          android:textSize="12dp"
          android:gravity="center"
          android:layout_gravity="top|right"
          android:textColor="#fff"
          
          android:visibility="gone"
          />
       </FrameLayout>
       
       <!-- 首页 -->
       <FrameLayout
           android:id="@+id/mta_sy4Fl"
           android:layout_width="60dp"
          
        android:layout_height="wrap_content"
      >  
      <Button 
          android:id="@+id/mainNavbar_mainPageBt"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          
          android:text="首页4"
          android:textSize="14dp"
          android:layout_gravity="center"
          android:gravity="center|center_horizontal"
          />
      <!-- android:text="@string/mainNavbar_mainPageBtTxt" -->
      <TextView 
          android:id="@+id/mainNavbar_mainPageNotifyTv"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          android:textSize="12dp"
          android:gravity="center"
          android:layout_gravity="top|right"
          android:textColor="#fff"
          
          android:visibility="gone"
          />
       </FrameLayout>
       
       <!-- 首页 -->
       <FrameLayout
           android:id="@+id/mta_sy5Fl"
           android:layout_width="60dp"
          
        android:layout_height="wrap_content"
      >         
      <Button 
          android:id="@+id/mainNavbar_mainPageBt"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          
          android:text="首页5"
          android:textSize="14dp"
          android:layout_gravity="center"
          android:gravity="center|center_horizontal"
          />
      <!-- android:text="@string/mainNavbar_mainPageBtTxt" -->
      <TextView 
          android:id="@+id/mainNavbar_mainPageNotifyTv"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          android:textSize="12dp"
          android:gravity="center"
          android:layout_gravity="top|right"
          android:textColor="#fff"
          
          android:visibility="gone"
          />
       </FrameLayout>
       
       <!-- 我的新疆美 -->
       <FrameLayout
           android:id="@+id/mta_wdxjmFl"
           android:layout_width="60dp"
          
        android:layout_height="wrap_content"
        >         
      <Button 
          android:id="@+id/mainNavbar_myXjmeiBt"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          
          android:text="我的新疆美"
          android:textSize="14dp"
          android:gravity="bottom|center_horizontal"
          />
      <TextView 
          android:id="@+id/mainNavbar_myXjmeiNotifyTv"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          android:textSize="12dp"
          android:gravity="center"
          android:layout_gravity="top|right"
          android:textColor="#fff"
          android:text="2"
          android:visibility="gone"
          />
       </FrameLayout>
       
       <!-- 我的收藏 -->
       <FrameLayout
           android:id="@+id/mta_wdscFl"
           android:layout_width="60dp"
        android:layout_height="wrap_content"
        >         
      <Button 
           android:id="@+id/mainNavbar_myCollectBt"
           android:layout_width="60dp"
           android:layout_height="wrap_content"
           android:text="我的收藏"
           android:textSize="14dp"
           android:gravity="bottom|center_horizontal"
           /> 
      <TextView 
          android:id="@+id/mainNavbar_myCollectNotifyTv"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          android:textSize="12dp"
          android:gravity="center"
          android:layout_gravity="top|right"
          android:textColor="#fff"
          
          android:visibility="gone"
          />
       </FrameLayout>
       
       <!-- 购物车 -->
       <FrameLayout
           android:id="@+id/mta_gwcFl"
           android:layout_width="60dp"
        android:layout_height="wrap_content"
        >         
      <Button 
           android:id="@+id/mainNavbar_cartBt"
           android:layout_width="60dp"
           android:layout_height="wrap_content"
           android:text="购物车"
           android:textSize="14dp"
           android:gravity="bottom|center_horizontal"
           /> 
           <!-- android:text="@string/mainNavbar_cartBtTxt" -->
      <TextView 
          android:id="@+id/mainNavbar_cartNotifyTv"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          android:textSize="12dp"
          android:gravity="center"
          android:layout_gravity="top|right"
          android:textColor="#fff"
          android:text="2"
          android:visibility="gone"
          />
       </FrameLayout>


       <!-- 卖家中心 -->
       <FrameLayout
           android:id="@+id/mta_mjzxFl"
           android:layout_width="60dp"
        android:layout_height="wrap_content"
       
        android:visibility="visible" >  
           
      <Button 
           android:id="@+id/mainNavbar_sellerCBt"
           android:layout_width="60dp"
           android:layout_height="wrap_content"
           android:text="卖家中心"
           android:textSize="14dp"
           android:gravity="bottom|center_horizontal"
           />
      <!-- android:text="@string/mainNavbar_randomGoodsBtTxt" -->
      <TextView 
          android:id="@+id/mainNavbar_sellerCNotifyTv"
          android:layout_width="60dp"
          android:layout_height="wrap_content"
          android:textSize="12dp"
          android:gravity="center"
          android:layout_gravity="top|right"
          android:textColor="#fff"
         
          android:text="2"
          android:visibility="gone"
          />   
       </FrameLayout>
        </LinearLayout>
        </HorizontalScrollView> 
        <ImageView
       android:id="@+id/mainNavbar_mmrIv" 
       android:layout_width="wrap_content"
       android:layout_height="match_parent"
       android:src="@drawable/menu_more_right"
       android:contentDescription="menu_more_right"/>   
    </LinearLayout>
    </LinearLayout>


    这里需要注意的是我用一个HorizontalScrollView作为滚动菜单的面板,而且作为菜单项的FrameLayout的宽度设置成统一的固定宽度,方便实现根据菜单面板的宽度调整菜单项的宽度和显示的菜单项的个数。

    2、程序调整菜单项的宽度,在activity的onWindowFocusChanged方法中获取滚动菜单面板的宽度和每个菜单项的宽度,并且调整菜单项的宽度以便占满菜单面板,代码如下:

    public void onWindowFocusChanged(boolean hasFocus) {
    // TODO Auto-generated method stub
    super.onWindowFocusChanged(hasFocus);
    hsvWidth=mta_hsv.getWidth();
    System.out.println("onWindowFocusChanged--->hsvWidth:"+hsvWidth);
    btWidth=fl[0].getWidth();
    System.out.println("onWindowFocusChanged--->btWidth:"+btWidth);
    //System.out.println("testLl.getWidth():"+testLl.getWidth());
    count=hsvWidth/(btWidth);
    System.out.println("onWindowFocusChanged--->count:"+count);
    int cz=hsvWidth-(btWidth)*count;
    System.out.println("onWindowFocusChanged--->cz:"+cz);
    int pd=(cz/count);
    btWidth+=pd;
    System.out.println("onWindowFocusChanged--->pd:"+pd);
    for(int i=0;i<10;i++){
    //fl[i].setLayoutParams(new LayoutParams(btWidth+pd, LayoutParams.WRAP_CONTENT));
    LayoutParams lp=fl[i].getLayoutParams();
    lp.width=btWidth;
    fl[i].setLayoutParams(lp);
    }

    if(mta_hsv.getScrollX()>0){
    System.out.println("left:"+mta_hsv.getScrollX());
    mainNavbar_mmlIv.setVisibility(View.VISIBLE);
    }
    else{
    System.out.println("no-left:"+mta_hsv.getScrollX());
    mainNavbar_mmlIv.setVisibility(View.INVISIBLE);
    }
    if(mta_hsv.getScrollX()<=btWidth*(10-count-1)){
    System.out.println("right:"+mta_hsv.getScrollX());
    mainNavbar_mmrIv.setVisibility(View.VISIBLE);
    }
    else{
    System.out.println("no-right:"+mta_hsv.getScrollX());
    mainNavbar_mmrIv.setVisibility(View.INVISIBLE);
    }

    }


    3、注册HorizontalScrollView的OnTouch事件监听器,代码如下:

    mta_hsv.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    if(event.getAction()==MotionEvent.ACTION_MOVE){

    }
    else if(event.getAction()==MotionEvent.ACTION_DOWN){

    }
    else if(event.getAction()==MotionEvent.ACTION_UP){
    scrollX(v);
    final View fv=v;
    new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
    // TODO Auto-generated method stub
    scrollX(fv);
    }
    }, 500);//500毫秒后再次滚动一次,解决由于惯性滑动后不能滑动到合适位置的问题
    }

    return false;
    }
    private void scrollX(View v){//滑动到合适位置
    int endSx=v.getScrollX();
    System.out.println("endSx="+endSx);
    if(endSx<=(btWidth/2)){//如果滑动距离小于半个菜单项的宽度,则滑动距离0
    v.scrollTo(0, 0);
    }
    else if(endSx<=btWidth*1+(btWidth/2)){//如果滑动距离大于半个菜单项的宽度且小于一个半菜单项宽度,则滑动距离一个菜单项宽度
    v.scrollTo(btWidth*1, 0);
    }
    else if(endSx<=btWidth*2+(btWidth/2)){//如果滑动距离大于一个半菜单项的宽度且小于两个半菜单项宽度,则滑动距离两个菜单项宽度
    v.scrollTo(btWidth*2, 0);
    }
    else if(endSx<=btWidth*3+(btWidth/2)){//后面依次类推
    v.scrollTo(btWidth*3, 0);
    }
    else if(endSx<=btWidth*4+(btWidth/2)){
    v.scrollTo(btWidth*4, 0);
    }
    else if(endSx<=btWidth*5+(btWidth/2)){
    v.scrollTo(btWidth*5, 0);
    }
    else if(endSx<=btWidth*6+(btWidth/2)){
    v.scrollTo(btWidth*6, 0);
    }
    else if(endSx<=btWidth*7+(btWidth/2)){
    v.scrollTo(btWidth*7, 0);
    }
    else if(endSx<=btWidth*8+(btWidth/2)){
    v.scrollTo(btWidth*8, 0);
    }
    else if(endSx<=btWidth*9+(btWidth/2)){
    v.scrollTo(btWidth*9, 0);
    }
    else if(endSx<=btWidth*10+(btWidth/2)){
    v.scrollTo(btWidth*10, 0);
    }

    System.out.println("btWidth:"+btWidth+",count:"+count);
    System.out.println("mta_hsv.getScrollX():"+mta_hsv.getScrollX());

    if(mta_hsv.getScrollX()>0){
    System.out.println("left:"+mta_hsv.getScrollX());
    mainNavbar_mmlIv.setVisibility(View.VISIBLE);
    }
    else{
    System.out.println("no-left:"+mta_hsv.getScrollX());
    mainNavbar_mmlIv.setVisibility(View.INVISIBLE);
    }
    if(mta_hsv.getScrollX()<=btWidth*(10-count-1)){
    System.out.println("right:"+mta_hsv.getScrollX());
    mainNavbar_mmrIv.setVisibility(View.VISIBLE);
    }
    else{
    System.out.println("no-right:"+mta_hsv.getScrollX());
    mainNavbar_mmrIv.setVisibility(View.INVISIBLE);
    }
    }
    });

    这里通过监听松开按压事件来调整滚动位置。


    Activity的完整代码如下:

    package luoye.test.styletest;


    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.util.DisplayMetrics;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.View.OnTouchListener;
    import android.view.ViewGroup.LayoutParams;
    import android.view.ViewTreeObserver.OnPreDrawListener;
    import android.widget.Button;
    import android.widget.FrameLayout;
    import android.widget.HorizontalScrollView;
    import android.widget.ImageView;
    import android.widget.LinearLayout;


    public class MenuTestActivity extends Activity {







    int hsvWidth=0;
    HorizontalScrollView mta_hsv=null;
    LinearLayout testLl=null;

    FrameLayout []fl=new FrameLayout[10];
    int btWidth=0;
    int count=0;

    ImageView mainNavbar_mmlIv=null;
    ImageView mainNavbar_mmrIv=null;

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
    // TODO Auto-generated method stub
    super.onWindowFocusChanged(hasFocus);
    hsvWidth=mta_hsv.getWidth();
    System.out.println("onWindowFocusChanged--->hsvWidth:"+hsvWidth);
    btWidth=fl[0].getWidth();
    System.out.println("onWindowFocusChanged--->btWidth:"+btWidth);
    //System.out.println("testLl.getWidth():"+testLl.getWidth());
    count=hsvWidth/(btWidth);
    System.out.println("onWindowFocusChanged--->count:"+count);
    int cz=hsvWidth-(btWidth)*count;
    System.out.println("onWindowFocusChanged--->cz:"+cz);
    int pd=(cz/count);
    btWidth+=pd;
    System.out.println("onWindowFocusChanged--->pd:"+pd);
    for(int i=0;i<10;i++){
    //fl[i].setLayoutParams(new LayoutParams(btWidth+pd, LayoutParams.WRAP_CONTENT));
    LayoutParams lp=fl[i].getLayoutParams();
    lp.width=btWidth;
    fl[i].setLayoutParams(lp);
    }

    if(mta_hsv.getScrollX()>0){
    System.out.println("left:"+mta_hsv.getScrollX());
    mainNavbar_mmlIv.setVisibility(View.VISIBLE);
    }
    else{
    System.out.println("no-left:"+mta_hsv.getScrollX());
    mainNavbar_mmlIv.setVisibility(View.INVISIBLE);
    }
    if(mta_hsv.getScrollX()<=btWidth*(10-count-1)){
    System.out.println("right:"+mta_hsv.getScrollX());
    mainNavbar_mmrIv.setVisibility(View.VISIBLE);
    }
    else{
    System.out.println("no-right:"+mta_hsv.getScrollX());
    mainNavbar_mmrIv.setVisibility(View.INVISIBLE);
    }

    }

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

    setContentView(R.layout.menu_test);

    //取得显示边上有隐藏菜单的图片控件
    mainNavbar_mmlIv=(ImageView) findViewById(R.id.mainNavbar_mmlIv);
    mainNavbar_mmrIv=(ImageView) findViewById(R.id.mainNavbar_mmrIv);

    //取得菜单项
    fl[0]=(FrameLayout) findViewById(R.id.mta_syFl);
    fl[1]=(FrameLayout) findViewById(R.id.mta_sy1Fl);
    fl[2]=(FrameLayout) findViewById(R.id.mta_sy2Fl);
    fl[3]=(FrameLayout) findViewById(R.id.mta_sy3Fl);
    fl[4]=(FrameLayout) findViewById(R.id.mta_sy4Fl);
    fl[5]=(FrameLayout) findViewById(R.id.mta_sy5Fl);
    fl[6]=(FrameLayout) findViewById(R.id.mta_wdxjmFl);
    fl[7]=(FrameLayout) findViewById(R.id.mta_wdscFl);
    fl[8]=(FrameLayout) findViewById(R.id.mta_gwcFl);
    fl[9]=(FrameLayout) findViewById(R.id.mta_mjzxFl);

    //取得滚动控件
    mta_hsv=(HorizontalScrollView) findViewById(R.id.mta_hsv);

    // fl[0].getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {
    //
    // @Override
    // public boolean onPreDraw() {
    // // TODO Auto-generated method stub
    // if(btWidth==0){
    // System.out.println("fl[0]:"+fl[0].getMeasuredWidth());
    // btWidth=fl[0].getMeasuredWidth();
    //
    // count=hsvWidth/(btWidth);
    // System.out.println("onWindowFocusChanged--->count:"+count);
    // int cz=hsvWidth-(btWidth)*count;
    // System.out.println("onWindowFocusChanged--->cz:"+cz);
    // int pd=(cz/count);
    // btWidth+=pd;
    // System.out.println("onWindowFocusChanged--->pd:"+pd);
    // for(int i=0;i<10;i++){
    // //fl[i].setLayoutParams(new LayoutParams(btWidth+pd, LayoutParams.WRAP_CONTENT));
    // LayoutParams lp=fl[i].getLayoutParams();
    // lp.width=btWidth;
    // fl[i].setLayoutParams(lp);
    // }
    //
    // if(mta_hsv.getScrollX()>0){
    // System.out.println("left:"+mta_hsv.getScrollX());
    // }
    // else{
    // System.out.println("no-left:"+mta_hsv.getScrollX());
    // }
    // if(mta_hsv.getScrollX()<=btWidth*(10-count-1)){
    // System.out.println("right:"+mta_hsv.getScrollX());
    // }
    // else{
    // System.out.println("no-right:"+mta_hsv.getScrollX());
    // }
    //
    // }
    // return true;
    // }
    // });
    //
    // mta_hsv.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {
    //
    // @Override
    // public boolean onPreDraw() {
    // // TODO Auto-generated method stub
    // if(hsvWidth==0){
    // System.out.println("mta_hsv:"+mta_hsv.getMeasuredWidth());
    // hsvWidth=mta_hsv.getMeasuredWidth();
    // }
    // return true;
    // }
    // });

    mta_hsv.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    if(event.getAction()==MotionEvent.ACTION_MOVE){

    }
    else if(event.getAction()==MotionEvent.ACTION_DOWN){

    }
    else if(event.getAction()==MotionEvent.ACTION_UP){
    scrollX(v);
    final View fv=v;
    new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
    // TODO Auto-generated method stub
    scrollX(fv);
    }
    }, 500);//500毫秒后再次滚动一次,解决由于惯性滑动后不能滑动到合适位置的问题
    }

    return false;
    }
    private void scrollX(View v){//滑动到合适位置
    int endSx=v.getScrollX();
    System.out.println("endSx="+endSx);
    if(endSx<=(btWidth/2)){//如果滑动距离小于半个菜单项的宽度,则滑动距离0
    v.scrollTo(0, 0);
    }
    else if(endSx<=btWidth*1+(btWidth/2)){//如果滑动距离大于半个菜单项的宽度且小于一个半菜单项宽度,则滑动距离一个菜单项宽度
    v.scrollTo(btWidth*1, 0);
    }
    else if(endSx<=btWidth*2+(btWidth/2)){//如果滑动距离大于一个半菜单项的宽度且小于两个半菜单项宽度,则滑动距离两个菜单项宽度
    v.scrollTo(btWidth*2, 0);
    }
    else if(endSx<=btWidth*3+(btWidth/2)){//后面依次类推
    v.scrollTo(btWidth*3, 0);
    }
    else if(endSx<=btWidth*4+(btWidth/2)){
    v.scrollTo(btWidth*4, 0);
    }
    else if(endSx<=btWidth*5+(btWidth/2)){
    v.scrollTo(btWidth*5, 0);
    }
    else if(endSx<=btWidth*6+(btWidth/2)){
    v.scrollTo(btWidth*6, 0);
    }
    else if(endSx<=btWidth*7+(btWidth/2)){
    v.scrollTo(btWidth*7, 0);
    }
    else if(endSx<=btWidth*8+(btWidth/2)){
    v.scrollTo(btWidth*8, 0);
    }
    else if(endSx<=btWidth*9+(btWidth/2)){
    v.scrollTo(btWidth*9, 0);
    }
    else if(endSx<=btWidth*10+(btWidth/2)){
    v.scrollTo(btWidth*10, 0);
    }

    System.out.println("btWidth:"+btWidth+",count:"+count);
    System.out.println("mta_hsv.getScrollX():"+mta_hsv.getScrollX());

    if(mta_hsv.getScrollX()>0){
    System.out.println("left:"+mta_hsv.getScrollX());
    mainNavbar_mmlIv.setVisibility(View.VISIBLE);
    }
    else{
    System.out.println("no-left:"+mta_hsv.getScrollX());
    mainNavbar_mmlIv.setVisibility(View.INVISIBLE);
    }
    if(mta_hsv.getScrollX()<=btWidth*(10-count-1)){
    System.out.println("right:"+mta_hsv.getScrollX());
    mainNavbar_mmrIv.setVisibility(View.VISIBLE);
    }
    else{
    System.out.println("no-right:"+mta_hsv.getScrollX());
    mainNavbar_mmrIv.setVisibility(View.INVISIBLE);
    }
    }
    });
    }

    }



    完整源码下载地址:http://download.csdn.net/detail/luoye007001/5551659

    展开全文
  • 近期在做一个商城类项目,需要实现对一个订单里的多个商品分别评价的功能(类似淘宝的评价),花费了一点时间把效果做了出来,并在这里分享出来也权当做了记录,图个日后使用方便。 效果图 设计原理 ...

    前言

    近期在做一个商城类项目,需要实现对一个订单里的多个商品分别评价的功能(类似于淘宝的评价),花费了一点时间把效果做了出来,并在这里分享出来也权当做了记录,图个日后使用方便。


    img_2ca52c232358cf119b48bdf26daadf55.gif
    效果图

    设计原理

    img_247982912d0b114dab07215f67c2b54e.png
    设计原理

    因为每个订单可能有多个商品,所以我直接用一个RecyclerView来展示多个商品,这里主要的难点在于Item的布局。


    img_31f142e3572f09122213885575aaab12.png
    设计原理

    EvaluationView和EvaluationChoiceImageView是两个自定义View,分别用来选择评价类型和选择评价图片的。
    EvaluationView内部原理比较简单主要是在LinearLayout内部嵌套了EvaluationItem。


    img_7c908baa9f5550bfdfb01b5b01243e69.png

    EvaluationChoiceImageView的内部原理主要是使用FlowLayout(流式布局),然后将选择的图片添加到FlowLayout中,FlowLayout的好处就是它能够实现自动换行。
    img_73aa5e3adda82c65466b6e7909ec4972.gif

    另外EvaluationChoiceImageView可以通过添加监听事件来进行相应的操作
    //当点击选择图片的时候(这里一般通过调用addImage()方法进行添加图片操作)
    itemRegularevaluationEvaluationchoiceimageview.setOnClickAddImageListener(new EvaluationChoiceImageView.OnClickAddImageListener() {
                        @Override
                        public void onClickAddImage() {
                            itemRegularevaluationEvaluationchoiceimageview.addImage("图片的路径地址");
                        }
                    });
                    //当点击右上方叉号的时候触发此事件(一般用来删除数据)
                    itemRegularevaluationEvaluationchoiceimageview.setOnClickDeleteImageListener(new EvaluationChoiceImageView.OnClickDeleteImageListener() {
                        @Override
                        public void onClickDeleteImage(int position) {
                           //position是删除图片的位置
                        }
                    });
                    //当点击图片的时候触发此事件(一般用来查看图片)
                    itemRegularevaluationEvaluationchoiceimageview.setOnClickImageListener(new EvaluationChoiceImageView.OnClickImageListener() {
                        @Override
                        public void onClickImage(int position) {
                            //position是查看图片的位置
                        }
                    });
    

    代码解释

    这里首先是创建一个EvaluationBean用来存放每个商品需要提交的信息。

    public class EvaluationBean {
        //这里还可以加上其他的信息比如商品的Id
        private int evaluatinType=1;//默认好评
        private String evaluationContent;//评价内容
        private List<File> evaluationImages;//评价图片集合
    
        public EvaluationBean() {
            if(evaluationImages==null){
                evaluationImages=new ArrayList<>();
            }
        }
    
        public int getEvaluatinType() {
            return evaluatinType;
        }
    
        public void setEvaluatinType(int evaluatinType) {
            this.evaluatinType = evaluatinType;
        }
    
        public String getEvaluationContent() {
            return evaluationContent;
        }
    
        public void setEvaluationContent(String evaluationContent) {
            this.evaluationContent = evaluationContent;
        }
    
        public List<File> getEvaluationImages() {
            return evaluationImages;
        }
    
        public void setEvaluationImages(List<File> evaluationImages) {
            this.evaluationImages = evaluationImages;
        }
    
        @Override
        public String toString() {
            return "EvaluationBean{" +
                    "evaluatinType=" + evaluatinType +
                    ", evaluationContent='" + evaluationContent + '\'' +
                    ", evaluationImages=" + evaluationImages +
                    '}';
        }
    }
    

    然后再建立一个存放EvaluationBean的集合,集合的大小与订单中商品的数量相同。

    private void initDatas() {
            //        添加测试数据(简单的添加图片地址模拟订单)
            if(mTempDatas==null){
                mTempDatas=new ArrayList<>();
                for (int x=0;x<4;x++){
                    mTempDatas.add(""+x);
                }
            }
            if(evaluationBeans==null){
                evaluationBeans=new ArrayList<>();
            }
            for(int x=0;x<mTempDatas.size();x++){
                EvaluationBean evaluationBean=new EvaluationBean();
                evaluationBean.setEvaluatinType(1);
                evaluationBeans.add(evaluationBean);
            }
        }
    

    最后将选择好的数据通过遍历集合的方式传到服务器。

    for (EvaluationBean evaluationBean:evaluationBeans){
                        Log.e("测试",evaluationBean.toString());
                        HashMap<String,String> parama=new HashMap<>();
                        parama.put("evaluationType",evaluationBean.getEvaluatinType()+"");
                        parama.put("evaluationContent",evaluationBean.getEvaluationContent());
                        HashMap<String, RequestBody> pics=new HashMap<>();
                        for (File file:evaluationBean.getEvaluationImages()){
                            pics.put(file.getName(),RequestBody.create(MediaType.parse("image/*"), file));
                        }
                        RetrofitUtils.getInstance().getApiServier(Api.class)
                                .submitEvaluation(parama,pics)
                                .subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe(new Consumer<ResultBean>() {
                                    @Override
                                    public void accept(ResultBean resultBean) throws Exception {
    
                                    }
                                }, new Consumer<Throwable>() {
                                    @Override
                                    public void accept(Throwable throwable) throws Exception {
    
                                    }
                                });
                    }
    

    大体流程就是这样,更加详细的实现可以看一下我的代码(GitHub传送门

    个人技术博客:https://myml666.github.io/

    展开全文
  • 仿淘宝AndroidStudio源码

    2020-07-14 23:31:45
    仿淘宝手机端开发程序,参考项目开发比较实用。
  • android实现类似淘宝详情一样的页面,但又有所不同。本文只是提供一种思路,控件的普适性还不够,希望读者能自行修改。

    公司项目需求,需要一个类似淘宝详情一样的页面,但又有所不同,于是自己写了一个。本文只是提供一种思路,控件的普适性还不够,希望读者能自行修改。


    老规矩,先上一个项目原图吧:



    本文只是上图右边部分效果。demo也只有右边部分。不过这个控件的代码是一样的。

    直接贴代码

    TwoPageLayout.java:

    /**
     * Created by paulz on 2016/9/21.
     */
    public class TwoPageLayout extends ViewGroup {
        Context context;
        View pageOne;
        View pageTwo;
        private int mTouchSlop;
        private int mPageChangeLimit;
        private int currentPage;
        private boolean isIntercept;
    
        OnPageChangeListener mOnPageChangeListener;
        public OverScroller scroller;
    
    
        public TwoPageLayout(Context context) {
            super(context);
            init(context);
        }
    
        public TwoPageLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context);
        }
    
        public TwoPageLayout(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(context);
    
        }
    
    
        private void init(Context context){
            this.context=context;
            final ViewConfiguration vc = ViewConfiguration.get(context);
            mTouchSlop=vc.getScaledTouchSlop();
            //滑动翻页的临界值
            mPageChangeLimit=150;
            scroller=new OverScroller(getContext());
        }
    
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            switch (ev.getAction()){
                case MotionEvent.ACTION_DOWN:
                    downX=ev.getX();
                    downY=ev.getY();
                    isIntercept=touchChildToTop();
                    break;
                case MotionEvent.ACTION_MOVE:
                    if(!isIntercept)return false;
                    if(Math.abs(downY-ev.getY())>mTouchSlop){
                        //滑动开始
                        if(currentPage==1&&downY-ev.getY()<0){
                            isScrolling=true;
                            return true;
                        }else if(currentPage==0&&downY-ev.getY()>0){
                            isScrolling=true;
                            return true;
                        }
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    isScrolling=false;
                    break;
                case MotionEvent.ACTION_CANCEL:
                    isScrolling=false;
                    break;
            }
            return super.onInterceptTouchEvent(ev);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            measureChildren(widthMeasureSpec,heightMeasureSpec);
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            if(pageOne==null){
                pageOne=getChildAt(0);
            }
            if(pageTwo==null){
                pageTwo=getChildAt(1);
            }
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
                if (pageOne!=null&&pageOne.getVisibility() != GONE) {
                    pageOne.layout(0+getPaddingLeft(), 0+getPaddingTop(), getWidth()-getPaddingRight(), getHeight()-getPaddingBottom());
                }
                if (pageTwo!=null&&pageTwo.getVisibility() != GONE) {
                    pageTwo.layout(0+getPaddingLeft(), getHeight(), getWidth()-getPaddingRight(), getHeight()+getHeight()-getPaddingBottom());
                }
        }
    
        private float downX;
        private float downY;
        private boolean isScrolling;
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    downX=event.getX();
                    downY=event.getY();
                    isIntercept=touchChildToTop();
                    break;
                case MotionEvent.ACTION_MOVE:
                    if(currentPage==1&&downY-event.getY()<0){
                        isScrolling=true;
                    }else if(currentPage==0&&downY-event.getY()>0){
                        isScrolling=true;
                    }else {
                        isScrolling=false;
                    }
                    if(currentPage==1&&!isIntercept){
                        isScrolling=false;
                    }
                    if(isScrolling){
                        if(currentPage==0&&downY-event.getY()>0){//整体向上偏移,翻到下一页
                            scrollTo(0,(int)(downY-event.getY()));
                        }else if(currentPage==1&&downY-event.getY()<0){//翻到上一页
                            scrollTo(0,getHeight()+(int)(downY-event.getY()));
                        }else {
                            return false;
                        }
                    }else {
                        return false;
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    if(isScrolling){
                        if(currentPage==0){
                            if((downY-event.getY()>mPageChangeLimit)){
                                scroller.startScroll(0,getScrollY(),0,getHeight()-getScrollY(),500);
                                invalidate();
    //                            scrollTo(0,getHeight());
                                currentPage=1;
                                if(mOnPageChangeListener!=null){
                                    mOnPageChangeListener.onPageChanged(currentPage,pageTwo,true);
                                }
                            }else {
                                scroller.startScroll(0,getScrollY(),0,-getScrollY(),300);
                                invalidate();
    //                            scrollTo(0,0);
                            }
                        }else {
                            if(Math.abs(downY-event.getY())>mPageChangeLimit){
                                scroller.startScroll(0,getScrollY(),0,-getScrollY(),500);
                                invalidate();
                                if(mOnPageChangeListener!=null){
                                    mOnPageChangeListener.onPageChanged(currentPage,pageOne,true);
                                }
                                currentPage=0;
                            }else {
                                scroller.startScroll(0,getScrollY(),0,pageOne.getHeight()-getScrollY(),300);
                                invalidate();
    //                            scrollTo(0,pageOne.getHeight());
                            }
                        }
                        isScrolling=false;
                    }
                    isIntercept=false;
                    break;
                case MotionEvent.ACTION_CANCEL:
                    isScrolling=false;
                    scrollTo(0,0);
                    isIntercept=false;
                    break;
            }
            return true;
        }
    
        private WebView childOne;
        private ListView childTwo;
        private int curTouchChild;
    
        public void setScrollerChildren(WebView childOne, ListView childTwo){
            this.childOne=childOne;
            this.childTwo=childTwo;
            curTouchChild=0;
        }
    
        public void changeCurScrollerChild(int i){
            curTouchChild=i;
        }
    
    
        //实现第二页中包含可滑动控件时是否滑到顶部
        //从而决定本控件是否处理touch事件。
        private boolean touchChildToTop(){
            if(curTouchChild==0&&childOne!=null&&childOne.getScrollY()<=0){
                return true;
            }else if(curTouchChild==1&&childTwo!=null&&childTwo.getScrollY()<=0&&childTwo.getFirstVisiblePosition()==0){
                return true;
            }else {
                return false;
            }
        }
    
    
        @Override
        public void computeScroll() {
            if(scroller.computeScrollOffset()){
                scrollTo(0,scroller.getCurrY());
                postInvalidate();
            }
        }
    
        public void setOnPageChangeListener(OnPageChangeListener onPageChangeListener){
            mOnPageChangeListener=onPageChangeListener;
    
        }
    
        public interface OnPageChangeListener{
            public void onPageChanged(int page, View currentView,boolean bySelf);
        }
    
    
    }


    MainActivity.java:

    public class MainActivity extends AppCompatActivity {
        TwoPageLayout mLayout;
        WebView mWebView;
        RadioGroup mTabs;
        ListView mListview;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
    
        }
        private List<Map<String ,String>> getListData(){
            List<Map<String ,String>> data=new ArrayList<>();
            Random r=new Random(100);
            for(int i=0;i<20;i++){
                Map<String,String> map=new HashMap<>();
                map.put("key_text", "第二页第二选项卡 listview---item+"+i);
                map.put("key_text2", "呵呵 listview---item+"+i);
                data.add(map);
            }
            return data;
        }
    
        private void initView() {
            mLayout=(TwoPageLayout)findViewById(R.id.main_content);
            mWebView=(WebView)findViewById(R.id.web_view);
    
            mTabs=(RadioGroup)findViewById(R.id.radio_group);
            mListview=(ListView)findViewById(R.id.lv);
            initWebView();
            mWebView.loadUrl("http://blog.csdn.net/qinzhen308/article/details/52789199");
            //设置滑动会冲突的视图进去
            mLayout.setScrollerChildren(mWebView,mListview);
    
            //第二页切换标签
            mTabs.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    switch (checkedId){
                        case R.id.rb_detail:
                            mListview.setVisibility(View.GONE);
                            mWebView.setVisibility(View.VISIBLE);
                            mLayout.changeCurScrollerChild(0);
                            break;
                        case R.id.rb_comments:
                            mWebView.setVisibility(View.GONE);
                            mListview.setVisibility(View.VISIBLE);
                            mLayout.changeCurScrollerChild(1);
                            break;
                    }
                }
            });
            mTabs.check(R.id.rb_detail);
            mListview.setAdapter(new SimpleAdapter(MainActivity.this,getListData(),R.layout.item_adapter,new String[]{"key_text","key_text2"},new int[]{R.id.text1,R.id.text2}));
            //监听切换到那一页了
            mLayout.setOnPageChangeListener(new TwoPageLayout.OnPageChangeListener() {
                @Override
                public void onPageChanged(int page, View currentView, boolean bySelf) {
                    Toast.makeText(getApplicationContext(),"当前页码:"+page+",是否自己改变:"+bySelf,Toast.LENGTH_LONG).show();
                    if(page==1){
    //                    mWebView.loadUrl("http://blog.csdn.net/qinzhen308/article/details/52789199");
                        if(mTabs.getCheckedRadioButtonId()==R.id.rb_detail){
                            mWebView.loadUrl("http://blog.csdn.net/qinzhen308/article/details/52789199");
                        }
                    }
                }
            });
        }
    
        private void initWebView() {
            // LayoutParams lp=new
            // LayoutParams(LayoutParams.MATCH_PARENT,ScreenUtil.HEIGHT);
            // mWebView.setLayoutParams(lp);
            // contentInSV.addView(mWebView);
            WebSettings wSet = mWebView.getSettings();
            wSet.setDefaultTextEncodingName("UTF-8");
            wSet.setJavaScriptEnabled(true);
            mWebView.setVerticalScrollbarOverlay(true); // 指定的垂直滚动条有叠加样式
            wSet.setUseWideViewPort(true);// 设定支持viewport
            wSet.setLoadWithOverviewMode(true);
            wSet.setBuiltInZoomControls(false);
            wSet.setSupportZoom(false);
    //        wSet.setDisplayZoomControls(false);
            mWebView.setWebViewClient(new WebViewClient() {
    
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    // TODO Auto-generated method stub
                    view.loadUrl(url);
                    return true;
                }
    
                @Override
                public void onPageFinished(WebView view, String url) {
                    // TODO Auto-generated method stub
                    super.onPageFinished(view, url);
                }
            });
        }
    }

    activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.paulz.towpageview.MainActivity">
    
        <com.paulz.towpageview.TwoPageLayout
            android:id="@+id/main_content"
            android:padding="10dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@android:color/white"
            android:orientation="vertical" >
    
            <!--<ScrollView
                android:layout_width="match_parent"
                android:layout_height="match_parent">-->
                <LinearLayout
                    android:id="@+id/layout_page1"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical" >
    
                    <TextView
                        android:id="@+id/tv_good_title"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="5dp"
                        android:layout_toLeftOf="@+id/tv_promote_tip"
                        android:minLines="3"
                        android:background="@android:color/white"
                        android:padding="5dp"
                        android:text="杀寇决客流量卡可拉伸的"
                        android:textColor="@android:color/black"
                        android:textSize="16sp" />
    
    
                    <TextView
                        android:id="@+id/tv_good_sub_title"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:padding="20px"
                        android:text="卡萨丁卡机考老师的"
                        android:textColor="@android:color/black"
                        android:textSize="16sp"
                        android:visibility="visible" />
    
                    <LinearLayout
                        android:id="@+id/layout_price_before"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@android:color/white"
                        android:orientation="horizontal"
                        android:paddingTop="10dp" >
    
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="10dp"
                            android:text="市场价:"
                            android:textColor="@android:color/darker_gray"
                            android:textSize="14sp" />
    
                        <TextView
                            android:id="@+id/tv_price_before"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:padding="5dp"
                            android:text="¥118.00元"
                            android:textColor="@android:color/darker_gray"
                            android:textSize="14sp" />
                    </LinearLayout>
    
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@android:color/white"
                        android:orientation="horizontal"
                        android:paddingTop="10dp" >
    
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="10dp"
                            android:text="会员价:"
                            android:textColor="@android:color/darker_gray"
                            android:textSize="14sp" />
    
    
                        <TextView
                            android:id="@+id/tv_price"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="10dp"
                            android:text="0.00"
                            android:textStyle="bold"
                            android:textColor="#f98816"
                            android:textSize="16sp" />
    
    
    
                    </LinearLayout>
    
                    <View
                        android:layout_width="1dp"
                        android:layout_height="400dp"
                        />
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:drawableLeft="@drawable/ic_pull_up"
                        android:drawablePadding="10dp"
                        android:layout_gravity="center_horizontal"
                        android:text="上拉查看更多"
                        android:textSize="18sp"
                        android:gravity="center_vertical"
                        android:textColor="@android:color/darker_gray"
                        android:layout_marginTop="10px"
                        />
    
                </LinearLayout>
    
    
            <!--</ScrollView>-->
    
    
    
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">
    
                <RadioGroup
                    android:id="@+id/radio_group"
                    android:layout_width="match_parent"
                    android:layout_margin="20dp"
                    android:layout_height="45dp"
                    android:layout_gravity="center_horizontal"
                    android:orientation="horizontal"
                    >
                    <RadioButton
                        android:id="@+id/rb_detail"
                        android:layout_width="0dp"
                        android:layout_weight="1"
                        android:layout_height="match_parent"
                        android:textColor="@color/btn_white_and_yellow"
                        android:background="@drawable/rb_bg_goods_detail"
                        android:checked="true"
                        android:button="@null"
                        android:gravity="center"
                        android:text="图文详情"
                        android:textSize="16sp"
                        />
    
                    <RadioButton
                        android:id="@+id/rb_comments"
                        android:layout_width="0dp"
                        android:layout_weight="1"
                        android:layout_height="match_parent"
                        android:textColor="@color/btn_white_and_yellow"
                        android:background="@drawable/rb_bg_goods_detail"
                        android:button="@null"
                        android:gravity="center"
                        android:text="商品评价"
                        android:textSize="16sp"
                        />
                </RadioGroup>
    
                <WebView
                    android:id="@+id/web_view"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:visibility="visible" />
    
                <ListView
                    android:id="@+id/lv"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:divider="@null"
                    android:visibility="gone"
                    />
    
            </LinearLayout>
    
        </com.paulz.towpageview.TwoPageLayout>
    </RelativeLayout>
    

    主要代码就这几部分。TowPageLayout这个布局的用法有点类似DrawerLayout,他只能拥有2个子视图,看字面意思也就是2页的布局嘛。主要需要注意的是,当第二页有可滑动控件的情况,需要对事件拦截。滑动的动画是通过OverScroller这个类进行辅助计算。当然要注意,OverScroller只是负责计算滑动过程中的坐标变化,并不会改变控件的滑动状态,需要通过重绘来实现位置的改变。


    源码地址:https://github.com/qinzhen308/TwoPageView

    展开全文
  • 如果你是网购达人,你的手机上一定少不了淘宝客户端。关注特效的人一定都会发现,淘宝不管是网站还是手机客户端,主页上都会有一个图片滚动播放器,上面展示一些它推荐的商品。这个几乎可以用淘宝来冠名的功能,看...
  • 请问下,怎么实现类似类似ios淘宝商品分类筛选的UI效果(**已经自我解决了**) ![图片说明](https://img-ask.csdn.net/upload/201605/25/1464175366_183980.png)![图片说明]...
  • 其实原理很简单。使用ViewFlipper,然后把要滚动的控件添加进去就可以了,当然首先得感谢各位前辈先写好底层的东西~~~~ ... android:id="@+id/zy_fragment_vf" android:layout_width="match_pa...
  • 需求和淘宝等电商的功能大体差不多,最上面一个搜索框,下面显示搜索历史记录。在EditText里输入要搜索的关键字后,按软键盘的搜索按键/延迟xxxxms后自动搜索。然后将搜索的内容展示给用户/提示用户没有搜到相关信息...
  • Android仿淘宝购物车

    2016-04-27 00:34:43
    最近项目需要实现类似淘宝购物车的功能,仿了一个,直接上代码: public class MainActivity extends Activity implements OnCartListener, View.OnClickListener { private static final boolean DEBUG = true; ...
  • Android高仿淘宝物流时间轴(AndroidStudio版本),可以参考下
  • Android高仿淘宝物流显示界面 时间线 节点线 项目所需先分享出来一起探讨探讨
  • AndroidStudio项目开发,项目学习,借鉴。Android布局,Android学习,Android框架,期末作业,毕业设计。
  • Android 高仿淘宝购物车界面功能
  • 前几日一商城类项目,有一需求,需要对一份订单的里面几个商品进行分别评价(图片,文字内容,星级);以前都是对一份订单所有商品一起评价,那种简单的多; 后来,承蒙老大细心指导,终于弄出来个看起来还算凑活的...
  • 自定义view: package ...import android.content.Context; import android.util.AttributeSet; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import an
1 2 3 4 5 ... 20
收藏数 9,377
精华内容 3,750
关键字:

类似淘宝的android