實習連載日記4.1-每天都是愚人節

  • BLUR效果,毛玻璃效果,模糊效果
  • drawable轉bitmap
  • bitmap setPixels報java.lang.IllegalStateException異常解決方法
  • activity中獲取contentView
  • animte()相關
  • webview播放視頻良好js交互
  • WebView本地java方法和js之間的調用
  • setoverscroll 邊界回彈
  • viewpager addpagechangedlistener

#雜談

這些天都沒有接到活,所以沒怎麼更新博客,心情也有些低落。

低落的是我想幹活,卻沒有。

實習生活真輕鬆,上面沒有活給我,我開着QQ 的遠程協助,幫朋友改BUG,這個朋友長得帥,還有一身肌肉,真是顛覆大家對程序員的印象。他叫tbs,可以叫他tab,無所謂的,反正他也不看博客。

在我打字的時候,他又來找我了,QQ協助又開了。。。。。。

調好了,回來繼續敲。

恩,我的能力是可以改bug的。應該是吧,可能是吧,,,可能也不是。我不知道。我沒有自信。

想起了上週團建了,團建就是去懷柔玩,挺不錯的,就是攝影老師不認我,根本沒有我的鏡頭,存在感好低。不過挺好的,我喜歡這樣。

就在剛纔接到了第一個自己寫代碼的任務。寫一個界面,挺簡單的,就一個數據加載。好開心的說。

今天是愚人節,本想和一個妹紙表白來着,但是看QQ空間裏有好多關於吐槽愚人節表白的,我也就不幹了。還是再等等吧。

愚人節突然有些感想。愚人節這個節日只是人們用來諷刺自己的,其實每個人都是不願接受現實的,當一個噩耗傳來時,你永遠都不會在第一時間相信的,但是當一個好消息傳來的時候,你就會在第一時間接受。這是人的慣性思維,所以我寧願矇蔽自己,我是最棒的,也不願承認我很垃圾這個事實。

所以說,哪天不是愚人節呢?

臥槽,我發這個帖子的時候已經過了12點了,已經不是愚人節了。。。。。。

##圖片模糊效果
看到項目中有一個模糊的效果,就百度了一下,發現了好多和這個一樣的帖子:
http://blog.csdn.net/sjf0115/article/details/7266998不好使
但是發現並不好使,原因很簡單,這個帖子中有兩種方法打到模糊的效果:
第一種,讀取每個像素點周圍的九個像素點,包括自己一共是九個,然後求出這九個像素點rgb值的平均值,再將這九個點的rgb設成這個平均值,來達到一種模糊的效果。爲什麼不管用呢?因爲你只是設置了顏色而已,並沒有裁剪,新的圖片和舊的圖片分辨率一樣,只是rgb值不同,只能達到一種變暗的效果,並不能模糊。
第二種,還是讀取九個像素點,但是是將這九個像素點作爲一個矩陣,3x3的,去乘一個3x3的高斯矩陣,然後將結果矩陣,設置爲新的rgb。這個和第一種方法一樣,並沒有裁剪,所以也是,只能變暗,不能模糊。
於是乎又百度到了這個:
http://www.cnblogs.com/baiyi168/p/6135255.html好使
這個就是調用了Android的原生代碼,沒錯是Android系統自帶的,RenderScript 。不過這個的缺點就是模糊的範圍太窄,程度太淺。
如果想要程度深的模糊的話,需要用第三方了。我們項目裏用的第三方就是fastblur。源碼沒看,都是一些位移操作。。。。。。

##drawable轉bitmap
如何獲取res文件夾下drawable文件夾下的圖片資源文件轉成一個BitMap對象 :

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); // 不存在設置默認圖片

http://blog.csdn.net/u013337840/article/details/38405573android

drawable和bitmap相互轉換:
很詳細,我就不說了。
http://blog.csdn.net/l_lhc/article/details/50923372

##bitmap setPixels IllegalStateException
http://blog.csdn.net/u010015933/article/details/51504552
這個異常不是setPixels導致的,而知你之前createbitmap的時候導致的,看一下createbitmap的源碼,觀察不同的createBitmap重載函數,發現,有的返回immutable bitmap,有的返回 mutable bitmap
mutable就是可改變的,immutable就是不可改變的。而 BitmapFactory.decodeResource()返回的也是immutable,不可改變的。
不可改變的bitamp調用setPixels就會報異常。這麼說雖然不準確,但是易於理解,而且大方向是正確的的。細節上是因爲bitmap在createbitmap 的時候創建了副本變量,具體怎麼回事我忘了,因爲博客是我好幾天沒寫,今天補的,補的時候按照之前的筆記和記憶寫的,記憶的話,有些 確實不太清楚。

##獲取你setcontent時的視圖
這個東西是我右邊ios實習那小子引導我入的坑。他是北工大的碩士。他說他一個頁面設置了佈局,然後另一個頁面繼承這個頁面,另一個頁面也會有這個佈局嗎?我就試了一下,在另一個頁面試着取一下這個視圖,恩,別說還真有。(記憶沒錯的話)

http://blog.csdn.net/lckj686/article/details/50949220
上面這個帖子講述了setcontentview的流程,phonewindow的分析以及取出contentView。

我要說一下Window PhoneWindow DecorView之間的關係:
window類,是一個抽象類,有繪製窗口的一系列api。

PhoneWindow類,是繼承自Window類的一個類,我好累。
他是所有activity都有的根視圖類。他上面進行添加其他view控件。

decorView,是phone的內部類,是FrameLayout的子類,修飾一些titlebar等等,以及添加其他view等等。

參考:
http://hi.csdn.net/attachment/201111/10/0_1320932280LPp2.gif
http://www.cppblog.com/fwxjj/archive/2013/01/13/197231.html
http://www.nowamagic.net/academy/detail/50160216
http://blog.csdn.net/qinjuning/article/details/7226787
getcontentview

##屬性動畫簡使用
就在找個簡單的使用,過兩天再開個帖子,發現日記貼不夠用啊。
http://blog.csdn.net/recordgrowth/article/details/51058600
animte()

##webview播放視頻良好js交互
http://mobile.51cto.com/abased-407001.htm
VideoEnabledWebView
作者沒看明白具體怎麼全屏的,我看是是通過addJavascriptInterface方法,將自己作爲一個對象傳過去,web端就可以調用我們Android端的組件,然後再web端用方法來全屏。具體怎麼實現的是在web端。

##WebView本地java方法和js之間的調用
這個是對上面標題的解釋:
http://www.oschina.net/code/snippet_232612_8531
WebView本地java方法和js之間的調用

##setoverscroll
http://blog.sina.com.cn/s/blog_5da93c8f0102uxxd.html
就是滑到邊界之後,Android有個原生的效果,用不用這個效果可以設置。

##viewpager addpagechangedlistener
onPageSelected(int position),當一個新頁面將要被確定下來的時候調用這個方法。其中postion代表新頁面的index。

onPageScrollStateChanged(int state),在滑動狀態發生改變之後會被調用。其中state有三種狀態,SCROLL_STATE_DRAGGING是指當前頁面正在被用戶拖動;SCROLL_STATE_SETTLING則指用戶的滑動動作已經結束,可以確認新頁面了;SCROLL_STATE_IDLE則指當前頁面處於空閒穩定的狀態。
test代碼:

public class MainActivity extends AppCompatActivity {
    private ViewPager viewPager;
    private List<String> list;
    private String onPageScrolled="onPageScrolled:";
    private String onPageScrollStateChanged="onPageScrollStateChanged:";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = (ViewPager) findViewById(R.id.vp);
        list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            list.add("我是第" + i + "幀");
        }
        viewPager.setAdapter(pagerAdapter);

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                //Log.i("xwq",onPageScrolled+"|position:"+position+"|positionOffset:"+positionOffset+"|positionOffsetPixels"+positionOffsetPixels);
            }

            @Override
            public void onPageSelected(int position) {
                Log.i("xwq","onPageselected:|position:"+position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                Log.i("xwq",onPageScrollStateChanged+"|state:"+state);
                //只要露另一個item的一點點,就會出現2;
                //每次滑動完,就是0,正在滑動就是1;
            }
        });

    }

    private PagerAdapter pagerAdapter = new PagerAdapter() {

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View pagerView = View.inflate(MainActivity.this, R.layout.item_pagerview, null);
            TextView textView = (TextView) pagerView.findViewById(R.id.tv);
            textView.setText(list.get(position));
            container.addView(pagerView,ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
            return pagerView;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    };
}

main的佈局:

<?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.xu.wencheese.pagechanged.MainActivity">

    <android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </android.support.v4.view.ViewPager>
</RelativeLayout>

item_pagerview.xml:

<?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">
<TextView
    android:text="我勒個擦"
    android:id="@+id/tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
</LinearLayout>

最後通過日誌發現:
那個state:
//只要露另一個item的一點點,就會出現2;
//每次滑動完,就是0,正在滑動就是1;

發佈了43 篇原創文章 · 獲贊 280 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章