開發(fā)筆記-Android-2017-11-15-圖片合成文字-cookie同步-listview的multiType

圖片合成文字

關(guān)鍵: 文字的居中: 測(cè)量文字區(qū)域的寬度
還要注意圖片放置的位置: 那個(gè)drawable下,或者是raw或assert下.不同地方,scale參數(shù)不同,最終生成的圖片大小也不同.

        Rect bounds0 = new Rect();
        textPaint.getTextBounds(compoundBean.name, 0, compoundBean.name.length(), bounds0);
        int x = compoundBean.nameEndX - bounds0.width()-3;
        compoundBean.nameStartX = x;
        canvas.drawText(compoundBean.name, x, compoundBean.nameEndY-5, textPaint);

全部代碼:

private void compoundIN(PicCompoundBean compoundBean) {
        XLogUtil.e(compoundBean.toString());
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
       Bitmap photo =  BitmapFactory.decodeResource(getResources(),compoundBean.rawId,options);

        int width = photo.getWidth(), hight = photo.getHeight();
        System.out.println("寬"+width+"高"+hight);
        Bitmap icon = Bitmap.createBitmap(width, hight, Bitmap.Config.ARGB_8888); //建立一個(gè)空的BItMap
        Canvas canvas = new Canvas(icon);//初始化畫布繪制的圖像到icon上

        Paint photoPaint = new Paint(); //建立畫筆
        photoPaint.setDither(true); //獲取跟清晰的圖像采樣
        photoPaint.setFilterBitmap(true);//過(guò)濾一些

        Rect src = new Rect(0, 0, photo.getWidth(), photo.getHeight());//創(chuàng)建一個(gè)指定的新矩形的坐標(biāo)
        Rect dst = new Rect(0, 0, width, hight);//創(chuàng)建一個(gè)指定的新矩形的坐標(biāo)
        canvas.drawBitmap(photo, src, dst, photoPaint);//將photo 縮放或則擴(kuò)大到 dst使用的填充區(qū)photoPaint

        Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);//設(shè)置畫筆
        textPaint.setTextSize(PicCompoundBean.nameFontSize);//字體大小
        //textPaint.setTypeface(Typeface.DEFAULT_BOLD);//采用默認(rèn)的寬度
        textPaint.setColor(Color.parseColor("#ea2420"));//采用的顏色

        Rect bounds0 = new Rect();
        textPaint.getTextBounds(compoundBean.name, 0, compoundBean.name.length(), bounds0);
        int x = compoundBean.nameEndX - bounds0.width()-3;
        compoundBean.nameStartX = x;
        canvas.drawText(compoundBean.name, x, compoundBean.nameEndY-5, textPaint);//繪制上去字淮逻,開始未知x,y采用那只筆繪制
       /* canvas.save(Canvas.ALL_SAVE_FLAG);
        canvas.restore();*/

        Paint textPaint2 = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);//設(shè)置畫筆
        textPaint2.setTextSize(PicCompoundBean.codeFontSize);//字體大小
        textPaint2.setTypeface(Typeface.DEFAULT_BOLD);//采用默認(rèn)的寬度
        //textPaint2.setColor(Color.parseColor("#e72fb8"));//采用的顏色


        Rect bounds = new Rect();
        //textPaint2.setTextAlign(Paint.Align.CENTER);
        textPaint2.getTextBounds(compoundBean.code, 0, compoundBean.code.length(), bounds);
        int x2 = (width - bounds.width())/2;
        compoundBean.codeStartX = x2;

        textPaint2.setShader(new LinearGradient(bounds.left, bounds.top, bounds.right, bounds.bottom, Color.parseColor("#f06776"),Color.parseColor("#e72fb8"),  Shader.TileMode.REPEAT));

        //textPaint.setShadowLayer(3f, 1, 1,this.getResources().getColor(android.R.color.background_dark));//影音的設(shè)置
        canvas.drawText(compoundBean.code, x2, compoundBean.codeStartY-14, textPaint2);//繪制上去字里伯,開始未知x,y采用那只筆繪制
        canvas.save(Canvas.ALL_SAVE_FLAG);
        canvas.restore();

        mIvContent.setImageBitmap(icon);
        isImageSet = true;
        bitmapForSave = icon;
        photo.recycle();

        XLogUtil.e("compoundIN---");

        //saveMyBitmap(icon);
    }

superAdpter在multiType下的bug:

https://github.com/hss01248/SuperAdapter
item增減時(shí),holder = (SuperLvHolder) convertView.getTag(); 所獲取的holder并非對(duì)應(yīng)type的holder:
修復(fù):

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        SuperLvHolder holder = null;
        if (convertView == null){
            holder = generateNewHolder(context,getItemViewType(position));
            convertView = holder.rootView;
            convertView.setTag(holder);
        }else {
            holder = (SuperLvHolder) convertView.getTag();
            //修復(fù)multitype下的bug:
            if(!(holder.type == getItemViewType(position))){
                holder = generateNewHolder(context,getItemViewType(position));
                convertView = holder.rootView;
                convertView.setTag(holder);
            }
        }
        holder.assingDatasAndEvents(context,datas.get(position),position,position == getCount() -1,isListViewFling,datas,this);
        return convertView;
    }

分享到facebook的messanger:

https://developers.facebook.com/docs/sharing/android
官方文檔對(duì)messanger只有從web端打開app的url,沒(méi)有Android端分享的示例,后來(lái)從Stack Overflow上找到:
其實(shí)與分享到facebook基本一樣,只不過(guò)一個(gè)是用MessageDialog,一個(gè)是用ShareDialog.

if (!MessageDialog.canShow(ShareLinkContent.class)) {
            callBack.onFail(new Throwable("MessageDialog.canShow(ShareLinkContent.class) is false"));
            return;

        }

        ShareLinkContent.Builder shareLinkContentBuilder = new ShareLinkContent.Builder()
            .setContentTitle(shareInfo.getShareContentTitle())
            .setContentDescription(shareInfo.getShareContentDescription())
            .setContentUrl(Uri.parse(shareInfo.getShareContentUrl()));
        shareLinkContentBuilder.setImageUrl(Uri.parse(shareInfo.getShareImageUrl()));
        MessageDialog messageDialog = new MessageDialog(activity);
        messageDialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() {
            @Override
            public void onSuccess(Sharer.Result result) {
                callBack.onSuccess();
            }

            @Override
            public void onCancel() {
                callBack.onCancel();
            }

            @Override
            public void onError(FacebookException error) {
                callBack.onFail(error);
            }
        });
        messageDialog.show(shareLinkContentBuilder.build());

cookie同步

項(xiàng)目中用到asyhttpclient,retrofit,以及webview,需要做cookie同步.
吐槽:其實(shí)項(xiàng)目中cookie只在登錄時(shí)返回,用于后續(xù)鑒權(quán),且后續(xù)的請(qǐng)求服務(wù)器不再寫cookie. 鑒權(quán)模式的選擇很業(yè)余,不倫不類.

  • 同步方式1: 利用文件實(shí)現(xiàn)同步:
    序列化到本地特定文件中,各client都從這個(gè)文件中讀寫cookie.

  • 同步方式2:某一client負(fù)責(zé)文件讀寫,其他從這個(gè)client的內(nèi)存中讀取:
    由于asyhttpclient和retrofit中Cookie類不一樣,所以需要轉(zhuǎn)換:

 private org.apache.http.cookie.Cookie transCookie(Cookie item) {
        BasicClientCookie2 cookie = new BasicClientCookie2(item.name(),item.value());
        cookie.setPath(item.path());
        cookie.setDomain(item.domain());
        return cookie;
    }

    private Cookie transCookie2(org.apache.http.cookie.Cookie item) {
        Cookie cookie = new Cookie.Builder()
            .domain(item.getDomain())
            //.expiresAt(item.getExpiryDate().getTime())
            .name(item.getName())
            .path(item.getPath())
            .value(item.getValue())
            .build();
        return cookie;
    }

okhttpclient讀寫時(shí)拿到AsyHttpclient里的cookie:


//讀cookie
@Override
    public List<Cookie> loadForRequest(HttpUrl url) {
        try {
            List<Cookie> cookies = cookieStore.getCookies();
            if(cookies ==null){
                cookies = new ArrayList<>();
            }
            XLogUtil.obj(cookies);

            List<org.apache.http.cookie.Cookie> cookiesFromAsyHttp = HttpManager.getInstance().getAllCookie();
            //addCookieFromAsyHttp(cookies,cookiesFromAsyHttp);
            XLogUtil.obj(cookiesFromAsyHttp);
            XLogUtil.obj(cookies);
            return cookies ;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new ArrayList<>();
    }


//寫cookie
@Override
    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
        try {
            if (cookies != null && cookies.size() > 0) {
                for (Cookie item : cookies) {
                    cookieStore.addCookie(item);
                    org.apache.http.cookie.Cookie cookie = transCookie(item);
                    //HttpManager.getInstance().getCookieStore().addCookie(cookie);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

webview同步來(lái)自AsyHttpclient里的cookie:

核心:

CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        cookieManager.setCookie(url, cookie);
private void syncWebViewCookie() {
        List<Cookie> cookies = HttpManager.getInstance().getAllCookie();
        Context context = MyApplication.getInstance().getApplicationContext();
        Html5CookiesManger.syncCookie(context, mUrl, cookies);
    }

//Html5CookiesManger
/**
     * 將cookie同步到WebView
     *
     * @param url    WebView要加載的url
     * @param cookie 要同步的cookie
     * @return true 同步cookie成功,false同步cookie失敗
     */
    private static boolean syncCookie(Context context, String url, String cookie) {
        LoggerUtils.d(TAG, "context" + context);
        LoggerUtils.d(TAG, "url" + url);
        LoggerUtils.d(TAG, "cookie" + cookie);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            CookieSyncManager.createInstance(context);
        }
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        cookieManager.setCookie(url, cookie);//如果沒(méi)有特殊需求,這里只需要將session id以"key=value"形式作為cookie即可
        XLogUtil.e("h5 cookie2:"+cookie);
        String newCookie = cookieManager.getCookie(url);
        return !TextUtils.isEmpty(newCookie);
    }

    public static boolean syncCookie(Context context, String url, List<Cookie> cookies) {
        String host = "";
        try {
            host = new URL(url).getHost().toLowerCase();// 此處獲取值轉(zhuǎn)換為小寫
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        LoggerUtils.d(TAG, "size = " + cookies.size());
        String newCookie = "";
        for (Cookie cookie : cookies) {
            newCookie = cookie.getName() + "=" + cookie.getValue()
                    + ";Domain=" + cookie.getDomain()
                    + ";Path=" + cookie.getPath();
            XLogUtil.e("h5 cookie:"+newCookie);
            syncCookie(context, host, newCookie);
            LoggerUtils.d(TAG, "cookie" + cookie);
            LoggerUtils.d(TAG, "host" + host);
            LoggerUtils.d(TAG, "getDomain" + cookie.getDomain());
        }
        return syncCookie(context, host, newCookie);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖匈棘,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異析命,居然都是意外死亡主卫,警方通過(guò)查閱死者的電腦和手機(jī)逃默,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)簇搅,“玉大人完域,你說(shuō)我怎么就攤上這事〈窠” “怎么了吟税?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)姿现。 經(jīng)常有香客問(wèn)我肠仪,道長(zhǎng),這世上最難降的妖魔是什么备典? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任异旧,我火速辦了婚禮,結(jié)果婚禮上提佣,老公的妹妹穿的比我還像新娘吮蛹。我一直安慰自己,他們只是感情好镐依,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布匹涮。 她就那樣靜靜地躺著天试,像睡著了一般槐壳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喜每,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天务唐,我揣著相機(jī)與錄音,去河邊找鬼带兜。 笑死枫笛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刚照。 我是一名探鬼主播刑巧,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼无畔!你這毒婦竟也來(lái)了啊楚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浑彰,失蹤者是張志新(化名)和其女友劉穎恭理,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郭变,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颜价,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年涯保,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片周伦。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夕春,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出横辆,到底是詐尸還是另有隱情撇他,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布狈蚤,位于F島的核電站困肩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏脆侮。R本人自食惡果不足惜锌畸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望靖避。 院中可真熱鬧潭枣,春花似錦、人聲如沸幻捏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)篡九。三九已至谐岁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榛臼,已是汗流浹背伊佃。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沛善,地道東北人航揉。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像金刁,于是被迫代替她去往敵國(guó)和親帅涂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,327評(píng)論 25 707
  • #Android 基礎(chǔ)知識(shí)點(diǎn)總結(jié) ---------- ##1.adb - android debug bridg...
    Mythqian閱讀 3,300評(píng)論 2 11
  • 又是一年中秋佳節(jié),祝各位中秋節(jié)快樂(lè)抵屿。 今天我們來(lái)聊聊這個(gè)最近很火的網(wǎng)絡(luò)請(qǐng)求庫(kù)retrofit庆锦,在此基礎(chǔ)上會(huì)延伸出一...
    涅槃1992閱讀 7,792評(píng)論 13 133
  • 一. 我時(shí)常有這樣的困惑: 主持活動(dòng)時(shí)可以隨機(jī)應(yīng)變搂抒,各種典故手到拈來(lái)艇搀,不讓場(chǎng)子冷掉;面對(duì)頭一次見(jiàn)面的贊助商求晶,講述自...
    知其閱讀 3,448評(píng)論 33 121
  • 【我只是難過(guò)不能陪你一起老】中說(shuō):其實(shí)你我所擁有的都是這樣的淡青春焰雕,沒(méi)有兵荒馬亂,沒(méi)有動(dòng)蕩不安芳杏,沒(méi)有生死離別矩屁。不過(guò)...
    落微閱讀 303評(píng)論 0 1