精华内容
下载资源
问答
  • 我这里用了别人的封装的东西,直接附上代码,方便下次直接使用,注意:这里最多只能放置3张图片! 从布局文件开始,先是动态列表Item的视图 xmlns:app="http://schemas.android.com/apk/res-auto"

    我这里用了别人的封装的东西,直接附上代码,方便下次直接使用,注意:这里最多只能放置3张图片!

    从布局文件开始,先是动态列表Item的视图

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:orientation="vertical"
        android:background="#ffffff"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <ViewStub
            android:id="@+id/viewStub"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            />
    
    </LinearLayout>
    然后对应列表适配器的ViewHolder

    public abstract class EssenceContentViewHolder extends RecyclerView.ViewHolder {
    
        public final static int TYPE_IMAGE = 2;
        public int viewType;
    
        public EssenceContentViewHolder(View itemView,int viewtype) {
            super(itemView);
            this.viewType = viewtype;
            ViewStub viewStub = (ViewStub) itemView.findViewById(R.id.viewStub);
            initSubView(viewType,viewStub);
        }
    
        public abstract void initSubView(int viewType, ViewStub viewStub);
    }
    
    放置图片的ImageViewHolder

    public class ImageViewHolder extends EssenceContentViewHolder {
        /** 图片*/
        public MultiImageView multiImageView;
    
        public ImageViewHolder(View itemView){
            super(itemView, TYPE_IMAGE);
        }
    
        @Override
        public void initSubView(int viewType, ViewStub viewStub) {
            if(viewStub == null){
                throw new IllegalArgumentException("viewStub is null...");
            }
            viewStub.setLayoutResource(R.layout.viewstub_imageview_body);
            View subView = viewStub.inflate();
            MultiImageView multiImageView = (MultiImageView) subView.findViewById(R.id.multiImagView);
            if(multiImageView != null){
                this.multiImageView = multiImageView;
            }
        }
    }
    
    上面ImageViewHolder对应的布局

    <?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="wrap_content" >
    
        <demo.yang.com.baisi.Utils.MultiImageView
            android:id="@+id/multiImagView"
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp" >
        </demo.yang.com.baisi.Utils.MultiImageView>
    
    </LinearLayout>
    在动态列表的适配器的OnBindViewHolder方法里面进行是否有图片,有几张图片

    switch (((EssenceContentViewHolder)holder).viewType) {
                    case EssenceContentViewHolder.TYPE_IMAGE:// 处理图片
                        if(holder instanceof ImageViewHolder){
                            final List<String> photos = list.get(position).getPhoto();
                            if (photos!=null) {
                                ((ImageViewHolder)holder).multiImageView.setVisibility(View.VISIBLE);
                                ((ImageViewHolder)holder).multiImageView.setList(photos);
                                ((ImageViewHolder)holder).multiImageView.setOnItemClickListener(new MultiImageView.OnItemClickListener() {
                                    @Override
                                    public void onItemClick(View view, int position) {
                                       
                                    }
                                });
    
                                ((ImageViewHolder) holder).multiImageView.setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                      
                                    }
                                });
                            } else {
                                ((ImageViewHolder)holder).multiImageView.setVisibility(View.GONE);
                            }
                        }
    MultiImageView类
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    
    import com.bumptech.glide.Glide;
    import com.bumptech.glide.load.engine.DiskCacheStrategy;
    
    import java.util.List;
    
    import demo.yang.com.baisi.R;
    
    
    /**
     * @Description: 显示1~3张图片的View
     */
    
    public class MultiImageView extends LinearLayout {
        public static int MAX_WIDTH = 0;
        private static final String TAG = "MultiImageView  调试信息》》》";
    
        // 照片的Url列表
        private List<String> imagesList;
    
        /** 长度 单位为Pixel **/
        private int pxOneMaxWandH;  // 单张图最大允许宽高
        private int twoMaxWidth=0;
        private int pxMoreWandH = 0;// 多张图的宽高
        private int pxImagePadding = DensityUtil.dip2px(getContext(), 3);// 图片间的间距
    
        private int MAX_PER_ROW_COUNT = 3;// 每行显示最大数
    
        private LayoutParams onePicPara;
        private LayoutParams morePara, moreParaColumnFirst;
        private LayoutParams rowPara;
        private LayoutParams twoPara;
    
        private OnItemClickListener mOnItemClickListener;
        public void setOnItemClickListener(OnItemClickListener onItemClickListener){
            mOnItemClickListener = onItemClickListener;
        }
    
        public MultiImageView(Context context) {
            super(context);
        }
    
        public MultiImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public void setList(List<String> lists) throws IllegalArgumentException {
            if(lists==null){
                throw new IllegalArgumentException("imageList is null...");
            }
            imagesList = lists;
            if(MAX_WIDTH > 0){
                pxMoreWandH = (MAX_WIDTH - pxImagePadding*2 )/3; //解决右侧图片和内容对不齐问题
                twoMaxWidth =(MAX_WIDTH -pxImagePadding)/ 2;
    //            pxOneMaxWandH = 2*(MAX_WIDTH  / 3);//一张图最大宽度
                pxOneMaxWandH = MAX_WIDTH;
                initImageLayoutParams();
            }
    
            initView();
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            if(MAX_WIDTH == 0){
                int width = measureWidth(widthMeasureSpec);
                if(width>0){
                    MAX_WIDTH = width;
                    if(imagesList!=null && imagesList.size()>0){
                        setList(imagesList);
                    }
                }
            }
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    
        /**
         * Determines the width of this view
         *
         * @param measureSpec
         *            A measureSpec packed into an int
         * @return The width of the view, honoring constraints from measureSpec
         */
        private int measureWidth(int measureSpec) {
            int result = 0;
            int specMode = MeasureSpec.getMode(measureSpec);
            int specSize = MeasureSpec.getSize(measureSpec);
    
            if (specMode == MeasureSpec.EXACTLY) {
                // We were told how big to be
                result = specSize;
            } else {
                // Measure the text
                // result = (int) mTextPaint.measureText(mText) + getPaddingLeft()
                // + getPaddingRight();
                if (specMode == MeasureSpec.AT_MOST) {
                    // Respect AT_MOST value if that was what is called for by
                    // measureSpec
                    result = Math.min(result, specSize);
                }
            }
            return result;
        }
        /**
         * image尺寸初始化
         */
        private void initImageLayoutParams() {
            int wrap = LayoutParams.WRAP_CONTENT;
            int match = LayoutParams.MATCH_PARENT;
            onePicPara = new LayoutParams(pxOneMaxWandH,match);
    
            twoPara =new LayoutParams(twoMaxWidth,pxMoreWandH);
            twoPara.setMargins(pxImagePadding, 0, 0, 0);
    
            moreParaColumnFirst = new LayoutParams(pxMoreWandH, pxMoreWandH);
            morePara = new LayoutParams(pxMoreWandH, pxMoreWandH);
            morePara.setMargins(pxImagePadding, 0, 0, 0);
    
            rowPara = new LayoutParams(match, wrap);
        }
    
        // 根据imageView的数量初始化不同的View布局,还要为每一个View作点击效果
        private void initView() {
            this.setOrientation(VERTICAL);
            this.removeAllViews();
            if(MAX_WIDTH == 0){
                //为了触发onMeasure()来测量MultiImageView的最大宽度,MultiImageView的宽设置为match_parent
                addView(new View(getContext()));
                return;
            }
    
            if (imagesList == null || imagesList.size() == 0) {
                return;
            }
    
            if (imagesList.size() == 1) {
                addView(createImageView(0, false,1));
            } else {
                int allCount = imagesList.size();
                if(allCount == 4){
                    MAX_PER_ROW_COUNT = 2;
                }else{
                    MAX_PER_ROW_COUNT = 3;
                }
                int rowCount = allCount / MAX_PER_ROW_COUNT
                        + (allCount % MAX_PER_ROW_COUNT > 0 ? 1 : 0);// 行数
                for (int rowCursor = 0; rowCursor < rowCount; rowCursor++) {
                    LinearLayout rowLayout = new LinearLayout(getContext());
                    rowLayout.setOrientation(LinearLayout.HORIZONTAL);
    
                    rowLayout.setLayoutParams(rowPara);
                    if (rowCursor != 0) {
                        rowLayout.setPadding(0, pxImagePadding, 0, 0);
                    }
                    int columnCount = allCount % MAX_PER_ROW_COUNT == 0 ? MAX_PER_ROW_COUNT
                            : allCount % MAX_PER_ROW_COUNT;//每行的列数
                    if (rowCursor != rowCount - 1) {
                        columnCount = MAX_PER_ROW_COUNT;
                    }
                    addView(rowLayout);
    
                    int rowOffset = rowCursor * MAX_PER_ROW_COUNT;// 行偏移
                    for (int columnCursor = 0; columnCursor < columnCount; columnCursor++) {
                        int position = columnCursor + rowOffset;
                        rowLayout.addView(createImageView(position, true,allCount));
                    }
                }
            }
        }
    
        private ImageView createImageView(int position, final boolean isMultiImage, int size) {
            String url = imagesList.get(position);
            ImageView imageView = new ColorFilterImageView(getContext());
            if (!isMultiImage){//一张图
                imageView.setAdjustViewBounds(true);
                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                imageView.setMaxHeight(pxOneMaxWandH);
                imageView.setLayoutParams(onePicPara);
            }else {
                if (size==2){//两张图
                    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                    imageView.setLayoutParams(twoPara);
                }else {//三张图
                    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                    imageView.setLayoutParams(morePara);
                }
            }
            imageView.setId(url.hashCode());
            imageView.setOnClickListener(new ImageOnClickListener(position));
            Glide.with(getContext()).load(url).placeholder(R.drawable.yaoming).error(R.drawable.yaoming).diskCacheStrategy(DiskCacheStrategy.ALL).dontAnimate().into(imageView);
            return imageView;
        }
    
        private class ImageOnClickListener implements OnClickListener{
    
            private int position;
            public ImageOnClickListener(int position){
                this.position = position;
            }
    
            @Override
            public void onClick(View view) {
                if(mOnItemClickListener != null){
                    mOnItemClickListener.onItemClick(view, position);
                }
            }
        }
    
        public interface OnItemClickListener{
            public void onItemClick(View view, int position);
        }
    }
    其需要用到的工具类:

    
    import android.content.Context;
    import android.graphics.Color;
    import android.graphics.PorterDuff.Mode;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.widget.ImageView;
    
    /**
     *
     * @ClassName: ColorFilterImageView
     * @Description: 实现图像根据按下抬起动作变化颜色
     * @author hnclca
     * @date 2016-02-26
     *
     */
    public class ColorFilterImageView extends ImageView implements OnTouchListener {
        public ColorFilterImageView(Context context) {
            this(context, null, 0);
        }
    
        public ColorFilterImageView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public ColorFilterImageView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init();
        }
    
        private void init() {
            setOnTouchListener(this);
        }
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:  // 按下时图像变灰
                    setColorFilter(Color.GRAY, Mode.MULTIPLY);
                    break;
                case MotionEvent.ACTION_UP:   // 手指离开或取消操作时恢复原色
                case MotionEvent.ACTION_CANCEL:
                    setColorFilter(Color.TRANSPARENT);
                    break;
                default:
                    break;
            }
            return false;
        }
    }
    
    
    
    import android.content.Context;
    import android.util.DisplayMetrics;
    
    /**
     * @ClassName: DensityUtil
     * @Description: 像素工具
     * @author yiw
     * @date 2015-12-28 下午4:17:01
     */
    public class DensityUtil {
    
        public static int dip2px(Context context, float dpValue) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (dpValue * scale + 0.5f);
        }
    
        public static int px2dip(Context context, float pxValue) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (pxValue / scale + 0.5f);
        }
    
        /** 获取手机的密度*/
        public static float getDensity(Context context) {
            DisplayMetrics dm = context.getResources().getDisplayMetrics();
            return dm.density;
        }
    }
    
    写到这里所有需要的代码文件就差不多完工了,最后就是new 一个动态列表的适配器,在setData的时候记得data的列表参数之一要为图片的url列表。




    展开全文
  • 简述在Qt 之 QQ系统表情(五) 中 我们实现了自定义系统表情窗口,这一篇将简单介绍如何...表面上看起来这几个动作很简单,但是要想控制好着实不易,下面直接上代码。 代码之路//显示小窗口 void EmotionWindow::showSm

    简述

    Qt 之 QQ系统表情(五) 中 我们实现了自定义系统表情窗口,这一篇将简单介绍如何实现QQ聊天界面中小表情窗口切换至正常表情窗口的动画效果。

    先看看QQ的效果:

    这里写图片描述

    当鼠标悬浮在表情按钮之上显示小表情窗口,点击动态显示正常表情窗口,再点击隐藏窗口。表面上看起来这几个动作很简单,但是要想控制好着实不易,下面直接上代码。


    代码之路

    //显示小窗口
    void EmotionWindow::showSmallEmotion(QPoint point)
    {
        m_normalEmotionWidget->setVisible(false);
        m_smallEmotionWidget->setVisible(true);
        m_lableTitle->setText("This is Small Emotion Window");
        this->resize(QSize(m_smallEmotionWidget->width() + 20, m_smallEmotionWidget->height() + 50));
        move(point.x() - width() / 2, point.y() - height());
        show();
        activateWindow();
    }
    
    //从小窗口变换至大窗口效果显示
    void EmotionWindow::showNormalEmotion(QPoint point)
    {   
        //将小表情窗口和文字提示隐藏
        m_lableTitle->setVisible(false);
        m_smallEmotionWidget->setVisible(false);
        show();
        activateWindow();
        //动画显示
        QPropertyAnimation *pAnimation = new QPropertyAnimation(this, "geometry");
        QPoint startPoint(point.x() - width() / 2, point.y() - height());
        QPoint endPoint(point.x() - m_normalEmotionWidget->width() / 2, point.y() - m_normalEmotionWidget->height() - 50);
        // 动画显示时长
        pAnimation->setDuration(200);
        // 窗口变换起始尺寸
        pAnimation->setStartValue(QRect(startPoint.x(), startPoint.y(), width(), height()));
        // 窗口变换结束尺寸
        pAnimation->setEndValue(QRect(endPoint.x(), endPoint.y(), m_normalEmotionWidget->width() + 20, m_normalEmotionWidget->height() + 50));
        // 变换效果类型
        pAnimation->setEasingCurve(QEasingCurve::Linear);
        pAnimation->start(QAbstractAnimation::DeleteWhenStopped);
        // 动画效果显示结束显示正常的窗口
        connect(pAnimation, SIGNAL(finished()), this, SLOT(onAnimationFinished()));
    }
    
    //动画显示结束,显示正常的窗口
    void EmotionWindow::onAnimationFinished()
    {
        m_lableTitle->setVisible(true);
        m_normalEmotionWidget->setVisible(true);    
        m_lableTitle->setText("This is Normal Emotion Window");
    }
    
    bool EmotionWindow::eventFilter(QObject *obj, QEvent *event)
    {
        // 调用activeWindow()方法后进入
        if (QEvent::WindowActivate == event->type())
        {
            qDebug() << "WindowActivate_____________";
        }
        // 窗口失去焦点后进入(这里用来当鼠标点击表情窗口外的其他部分自动隐藏表情窗口)
        else if (QEvent::WindowDeactivate == event->type())
        {
            this->hide();
            qDebug() << "WindowDeactivate___________";
        }
        return __super::eventFilter(obj , event);
    }

    看一下效果图:
    这里写图片描述

    以上给出了关键的几个方法,具体鼠标点击按钮、悬浮在按钮上等显示不同的窗口由于还存在一些小问题,暂不给出具体实现,在下一篇中将完善实现完整效果,敬请期待!


    ——掐指一算,已经20天没有更新博客了,这20天说忙也忙,说不忙也不忙。时间永远都是海绵中的水,还是在于自己的掌控。Keep Coding , Keep Moving —— Every Day !

    展开全文
  • 1、登录QQ空间,点右上方“个人中心”→鼠标移到“好友动态”...2、可以直接QQ空间个人中心的好友动态里面,看到该好友动态后,鼠标移到动态右下方,如下图: 单击隐藏,如下图: 可以选择是否隐藏该人所有动态

    1、登录QQ空间,点右上方“个人中心”→鼠标移到“好友动态”如下图:


    单击“好友动态”,进入下图:


    在单击,设置按钮,进入下图:


    点击添加,在好友列表中选择不想显示人即可。

    2、可以直接在QQ空间个人中心的好友动态里面,看到该好友动态后,鼠标移到动态右下方,如下图:


    单击隐藏,如下图:


    可以选择是否隐藏该人所有动态。


    展开全文
  • qq群(vue学习交流):482739794 ----------------------------------------------------- 先来说下项目需求: 页面的组件不是直接引入且按照顺序放在页面上的, 而是根据后端返回的数据,来判断,动态的加载...

    -----------------------------------------------------

    qq群(vue学习交流):482739794

    -----------------------------------------------------

    先来说下项目需求:

    • 页面的组件不是直接引入且按照顺序放在页面上的,
    • 而是根据后端返回的数据,来判断,动态的加载某个组件

    思路步骤:

    • 引入组件

    import TabNew from './TabNew.vue'

    • 注册组件

    components: {
          'v-TabNew-2': TabNew

    }

    • 插入组件

    itemList.push({
                          component: 'v-NewHomeAd-1',
                          classname: '',
                          vIf: adverArr ? true : false,
                          data: adverArr
                        })

    • 通过 :is 动态绑定组件

    <component :is="item.component" v-if="item.vIf" :data="item.data" :class="item.classname" v-for="(item,index) in itemList"
          :key="index"></component>

    代码展示:

    (常见的直接将组件按照位置放在页面上,一般我们都是这样写的)

    <template>
      <div id="home_new">
        <!-- 查询话费、流量 -->
        <v-TelePhoneBill />
    
        <!-- tabNew栏 -->
        <v-TabNew-2 class="tab_top" :tabNew='tabNewArr' v-if="tabNewArr" />
    
        <!-- 专区 -->
        <v-SpecialArea-3 class="special_top" :specialNew="specialArr" v-if="specialArr.length!=0" />
    
        <!-- 广告 -->
        <v-NewHomeAd :adver="adver" v-if="adverArr" />
      </div>
    </template>

    (根据后端返回的值,动态的加载组件)

    <template>
      <div id="home_new">
       
        <component :is="item.component" v-if="item.vIf" :data="item.data" :class="item.classname" v-for="(item,index) in itemList"
          :key="index"></component>
        
      </div>
    </template>
    <script> 
    // 引入需要的组件
    import TabNew from './TabNew.vue'
    import SpecialArea from './Card/SpecialArea'
    import TelePhoneBill from './TelePhoneBill'
    import NewHomeAd from './Advertise/NewHomeAd'
    export default {
        data() {
          return {
            current: "",
            msg: "",
            locationCity: '',
            // tabNewArr: '', // tabnew栏
            // specialArr: [], //专区
            cityLocation: '', // 选择地区
            // adverArr: '', // 广告
            cityTxt: '选择地区',
            currentCity: '', // 城市
            provinceCode: '', // 城市编码
            itemList: [],
            adList: ''
          }
        },
    // 注册组件
        components: {
          'v-TabNew-2': TabNew,
          'v-SpecialArea-3': SpecialArea,
          'v-TelePhoneBill-4': TelePhoneBill,
          'v-NewHomeAd-1': NewHomeAd
        },
        methods:{
          getData() {
            var that = this;
            var url = "/v1/index/getIndexPageInfo.do";
            var params = {
              provinceCode: that.cityLocation.id || that.provinceCode // 省份code  北京的
            };
            that.httpRequest(url, params)
              .then(res => {
                var res = res.data;
                console.log('====首页接口的success', res.success);
                if (res.success) {
    
                  console.log("首页请求成功", res);
                  // 专区
                  let special1, special2, special3, specialArr1 = [],
                    specialArr2 = [],
                    specialArr3 = [],
                    typeList = [],
                    obj = {},
                    itemList = [];
                  for (var i in res.body) {
                    obj[res.body[i][0].type] = i; // 设置对象,为了在switch后面用到索引
                    console.log('设置的对象', obj);
                    var item = res.body[i][0].type;
                    switch (Number(item)) {
                      case 1:
                        console.log('111')
                        let adverArr = res.body[item] // 广告
                         // 动态插入组件
                        itemList.push({
                          component: 'v-NewHomeAd-1',
                          classname: '',
                          vIf: adverArr ? true : false,
                          data: adverArr
                        })
                        break;
                      case 2: // tab栏
                        console.log('222')
                        let tabNewArr = res.body[obj[item]] // tab栏显示
                        itemList.push({
                          component: 'v-TabNew-2',
                          classname: 'tab_top',
                          vIf: tabNewArr ? true : false,
                          data: tabNewArr
                        })
                        break;
                      case 3: // 专区
                        console.log('333')
                        special3 = res.body[item] // 携号转网
                        special1 = res.body[item] // 宽带专区
                        special2 = res.body[item] // 号卡专区
                        //专区 得存在一个数组里面 specialArr
                        special1.map((item) => {
                          specialArr1.push(item)
                        })
                        special2.map((item) => {
                          specialArr2.push(item)
                        })
                        special3.map((item) => {
                          specialArr3.push(item)
                        })
                        let specialArr = [];
                        specialArr.push(specialArr1, specialArr2, specialArr3)
                        itemList.push({
                          component: 'v-SpecialArea-3',
                          classname: 'special_top',
                          vIf: specialArr.length !== 0 ? true : false,
                          data: specialArr
                        })
                        break;
                      case 4: // 话费显示
                        console.log('4444')
                        // itemList.push({
                        //   component: 'v-TelePhoneBill-4',
                        //   classname: '',
                        //   vIf: true,
                        //   data: ''
                        // })
                        break;
                      case 5:
                        console.log('555')
                        break;
                    }
                  }
                  that.itemList = itemList;
                  console.log('that.itemList', that.itemList);
                }
              })
              .catch(error => {
                console.log(error);
              });
          }
        }

    vue动态组件官方文档

    ----------完。

    展开全文
  • JavaScript模仿QQ微博中自动识别网址,将其转换为超链接,以“网页链接”的...将输入的完整网址,在发表动态后,显示时,将原网址链接转换为超链接。 要求: 必须为完整网址,如: http://baidu.com; https://bai...
  • 文章目录实现思路MainActivity.javaNineGridAdapter.java回调onAddPicturesListener.javaitem布局加号图标item显示图片 实现思路 实现起来其实非常简单 我利用recyclerview工具,多item布局,在layoutmanager中...
  • 最近狼人杀要做缩小效果 缩小的效果就和QQ语音聊天点击收起的动态特效是一样的 。。。。。 恩 闲话少说 直接上代码 。。。 #pragma mark -- CA缩小动画效果 - (void)animateDismissTransition:(UIView *)view rect:...
  • Qt 之 模仿 QQ登陆界面——样式篇

    万次阅读 多人点赞 2016-12-21 22:57:23
    QQ好像从去年开始,登录界面有了一个3D动态效果,要实现这个也不难,直接使用GIF制作工具,录制动态效果生成GIF图,然后用QMovie加载Gif图,QLabel显示即可。效果图:可以从上面的效果图看出,整个登录界面的效果都...
  • 众所周知,基于位置的服务是移动设备的特色,比如现在天气预报可以根据用户所在位置自动选择城市,高德地图的手机导航,发QQ动态的时候我们可以显示自己位置,包括各种APP对百度地图API的使用等等。 那么使用这些都...
  • 动态网页举例:页面会随着输入的地点不同,显示不同地区的天气,随着时间不同显示不同时间的天气 架构分为CS架构和BS架构 cs架构:Client Server 服务器和客户端之间的关系,要么不升级,要么一起升级 CS不足: a....
  • 需要用libcurl,但是libcurl.dll依赖zlib1.dll,从网上下了多个版本的zlib1.dll都不可用,均显示"无法定位序数55于动态链接库zlib1.dll上"。从官网下源码包编译也失败了,最后在某篇博客下看到一老哥评论,把QQ的...
  • 如果想要动态显示数字,可以使用<stdio.h>、<string.h>进行字符的转换。 自带一张图片,直接下载默认显示此图片。 资源下载连接:https://download.csdn.net/download/qq_43588817...
  • 直接报Cannot read property 'getAttribute' of undefined 的错误, 但是图表还是显示了,不知道是什么原因</p><p>该提问来源于开源项目:F-loat/mpvue-echarts</p></div>
  • 用的是图形分析,窗口无须最大化,外挂窗口中动态实时显示,并可在外挂窗口直接点击
  • 在网页中加入QQ联系图标

    千次阅读 2009-06-17 20:13:00
    关于如何在网页中加入QQ联系图标:功能: 1,根据用户是否在线.在网页动态显示QQ图标 2,如果QQ在线,点击图标可以直接打开QQ程序对话
  • 软件支持采集QQ微博地址,软件可根据您设置的关键词(一次可设置多个)来采集相关的微博地址,真正的不放过一丝商机,及时抓住最近的、最热的推广、营销动态,让您的网络推广与网络营销无往不利。 e时代qq综合采集...
  • XMNPhotoPickerKit 一款图片,视频选择类库 ... 喜欢的同学请给个star,感谢你的支持 ...* 支持直接显示相册选择 * 支持类似QQ方式Sheet选择 * iOS8 支持动态监测PhotoLibrary变化 * 支持预览图片,预览视频
  • 类似QQ秀的魔法表情

    千次阅读 2007-02-28 16:25:00
    研究Flash技术很久了看了QQ的魔法表情后,觉得比较有意思,所以做了一个 可以是动态的Flash文件.其实Flash运用的比较好的,感觉是再MSN里面.做的动态背景和动态头像.不过既然能显示在桌面,当然也能显示在IM聊天窗口中...
  • 1.动态读取exe当前目录下的images\images1-至5下面的图片(菜单选择),图片名称为1.jpg -> 16.jpg 共16张图片 因图片太大,只给了images\images1下一张图片,自行复制为1-16.jpg文件名,且images1-5都需要16张。 2....
  • 在快捷会话框输入消息后可直接发送。点击桌面好友头像,在出现的圆环框内可选择发送邮件,回到会话窗口和关闭桌面好友。 4.好友管理 拖拽式管理、可视化界面、多点触摸、圆弧动态分组排列,让界面好友的展示更加...
  • 免费版本自带仿QQ爱墙风格,但不包括动态QQ图案; 自定义脏话、敏感字词过滤、每页显示条数、列表条数、防灌水防刷间隔时间; 入库数据实现完善过滤,IP追踪; 含搜索功能、无序和列表浏览方式;管理员登录后可...
  • ---------------------- !... ...------------------------------ ...希望能在源代码上直接更改,改好后可发至我邮箱:1478181311@qq.com,谢谢。 3、CSDN发贴时,怎么源代码全部转换了,看的效果乱七八糟的。
  • 如图1是qq聊天消息的长按的弹窗,最主要的特点是有一个指针,指针的位置是手指触摸手机屏幕的位置,而且弹窗会根据手指的触摸屏幕的不同位置显示在不同的位置,由于项目需要,仿写了一个相似功能的弹窗,并封装成库...
  • 前台电脑版整站显示手机版二维码,在顶部“手机版”字样,鼠标经过即显示二维码,扫描即可访问手机版。 列表页分为单列宽屏与双列2种模式,可在后台--栏目管理--宽屏,中切换 内容页分为单列宽屏与双列2种模式,可...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 424
精华内容 169
关键字:

qq动态直接显示