static final class MyAdapter extends BaseAdapter {
/** override other methods here */
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
// inflate the view for row from xml file
// keep a reference to each widget on the row.
// here I only care about the button
holder = new ViewHolder();
holder.mButton = (Button)convertView.findViewById(R.id.button);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
// redefine the action for the button corresponding to the row
holder.mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// do something depending on position
performSomeAction(position);
// mark data as changed
MyAdapter.this.notifyDatasetChanged();
}
}
}
static final class ViewHolder {
// references to widgets
Button mButton;
}
}
我们知道Android 默认是不支持*.gif 的 但是又需要这些功能 怎么办? 继续之
其实 *.gif 编码 解码 要详细说的话 估计1星期也说不出什么来 而且很快就会忘记 因为其组成也极其复杂 且没什么原因 所以 从国外anddev 淘来一份如何解码*.gif 的代码 现与诸位分析 看该代码 推荐与*.gif 解码 一起看 效果会更好的 否则 看完即忘 所以把*.gif 解码 也一起释放给大家
其实 如何解码*.gif并不是今天的重点 现在大概说下如何使用该接口
假设 该接口为:TypegifOpenHelper.java
[使用]
1. 创建TypegifOpenHelper
TypegifOpenHelper gHelper = new TypegifOpenHelper();
2. 现有gif文件:lion.gif 存放在 res\raw 目录
int id = R.raw.lion; gHelper.read(this.getResources().openRawResource(id));
3. 当然 以上仅仅是:从*gif中提取出所有Bitmap 而现在要求是显示连贯动画 所以我们还需要开辟一个Thread 用于隔段时间通知View 刷新图片 显示下一张 如此不断循环
以上是理论部分 改天演示如何使用该接口 并以组件View的形式 供 *.java *.xml 中使用!!!!
牢骚一下
另外 Android自带的Movie是可以播放gif的,但是如果图片太大,它可能加载不成功,或者播放时图像扭曲。不够健壮 自己写一个gif解码器就是了。
另外 Android自带的Movie是可以播放gif的,但是如果图片太大,它可能加载不成功,或者播放时图像扭曲。不够健壮 自己写一个gif解码器就是了。
基本原理是这样的 不过我的代码 效率处理的不太好 其实可以一边解码 一边播放 会更好一点 特别 *.gif 比较大时 差别会比较明显 你有研究过这个么?
不过我在阅读楼主提供的代码时发现有一个问题,就是readShort()函数的实现
// read 8 bit data
protected int readShort() {
// read 16-bit value, LSB first
return read() | (read() << 8 );
}
这个考虑的是小端字节序存储吗?为何确定就是小端字节序呢,而没有考虑别的方式呢,这个与PC上Java编程时通过二进制流读取来获取short值的方法是一致的吗?
##############################
不好意思发到另一个帖子上了,希望楼主能看到。呵呵
不过我在阅读楼主提供的代码时发现有一个问题,就是readShort()函数的实现
// read 8 bit data
protected int readShort() {
// read 16-bit value, LSB first
return read() | (read() << 8 );
}
这个考虑的是小端字节序存储吗?为何确定就是小端字节序呢,而没有考虑别的方式呢,这个与PC上Java编程时通过二进制流读取来获取short值的方法是一致的吗?
##############################
不好意思发到另一个帖子上了,希望楼主能看到。呵呵
了解 没关系 至于你说的问题 应该不存在吧 因为目标是*.gif数据流 而不是pc 所以没有该必要
不过我在阅读楼主提供的代码时发现有一个问题,就是readShort()函数的实现
// read 8 bit data
protected int readShort() {
// read 16-bit value, LSB first
return read() | (read() << 8 );
}
这个考虑的是小端字节序存储吗?为何确定就是小端字节序呢,而没有考虑别的方式呢,这个与PC上Java编程时通过二进制流读取来获取short值的方法是一致的吗?
##############################
不好意思发到另一个帖子上了,希望楼主能看到。呵呵
了解 没关系 至于你说的问题 应该不存在吧 因为目标是*.gif数据流 而不是pc 所以没有该必要
我想知道的是*.gif文件中存储short值是以小端字节序存储的吗?这个是GIF文件格式中的明确标准吗?
因为如果只是从程序解析流的层面上来讲,是很有必要考虑大小端的问题呢,要不然结果肯定是错误的。
以下内容Sinfrancis版权所有,专注请注明来自 http://mdev.cc/dev
在Android中,传递数据使用Intent,Intent相当于各个Activity之间的桥梁,可以传递数据,可以通过Intent启动另外一个Activity。
Intent有显式和隐式之分,显式的是直接什么要启动的组件,比如Service或者Activity,隐式的通过配置的datatype、 url、action来找到匹配的组件启动。
此程序目的:
1、显式启动Activity和service
2、通过隐式的变量,启动Activity和Service
先来看先我们定义的变量类:
package cc.androidos.intent;
public class Book {
//Intent的数据类型
public static String CONTENT_TYPE = "cc.android/intent.demo";
//Intent中的URL,这里要使用Content开头,不然会找不到组件
public static String CONTENT_URI = "content://test/";
}程序主界面的代码:还有四个按钮,分别用于启动不同的组件:
package cc.androidos.intent;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class IntentDemo extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button firstbtn = (Button) findViewById(R.id.firstbtn);
Button firstbtnservice = (Button) findViewById(R.id.firstbtnservice);
Button secondbtn = (Button) findViewById(R.id.secondbtn);
Button secondbtnservice = (Button) findViewById(R.id.secondbtnservice);
firstbtn.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
//显式启动FirstIntentDemo Activity
Intent i = new Intent(getApplicationContext(),FirstIntentDemo.class);
startActivity(i);
}
});
firstbtnservice.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
//显式启动FirstService 后台服务
Intent i = new Intent(getApplicationContext(),FirstService.class);
startService(i);
}
});
secondbtn.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
//通过Action uri和dataype启动Activity
//程序会自动匹配到Intent-Filter配置中有(action属性)Action为Intent.ACTION_VIEW,并且数据类型(data)为cc.android/intent.demo的组件上
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(Book.CONTENT_URI), Book.CONTENT_TYPE);
startActivity(intent);
}
});
secondbtnservice.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
//通过Action uri和dataype启动Service
Intent intent = new Intent();
intent.setAction(Intent.ACTION_EDIT);
intent.setDataAndType(Uri.parse(Book.CONTENT_URI), Book.CONTENT_TYPE);
startService(intent);
}
});
}
}
以下分别是被启动的组件代码:
显式Activity和Service:
package cc.androidos.intent;
import android.app.Activity;
import android.os.Bundle;
public class FirstIntentDemo extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.firstintent);
}
}
===============================================
package cc.androidos.intent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class FirstService extends Service{
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
String tag = "First Service on Create";
Log.d(tag,"This is the first service...");
}
}
隐式启动的Activity和Service:
package cc.androidos.intent;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class SecondIntentDemo extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String tag = "SecondIntentDemo onCreate..";
setContentView(R.layout.secondintent);
Intent i = getIntent();
Log.d(tag, "intent type : " + i.getType());
Log.d(tag, "intent url : " + i.getData().toString());
}
}package cc.androidos.intent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class SecondService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
String tag = "Second service ";
Log.d(tag, "Startup second service... ");
}
}
AndroidManifest.xml文件配置:
这个很重要,需要配置好才行,不然会出现AcitvityNotFoundException
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cc.androidos.intent"
android:versionCode="1"
android:versionName="1.0.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".IntentDemo"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- First Intent Demo -->
<activity android:name=".FirstIntentDemo" android:label="@string/app_name">
</activity>
<!-- Second Intent Demo -->
<activity android:name=".SecondIntentDemo" android:label="@string/app_name">
<intent-filter >
<!--The intent filter parameters must match the intent datatype(mimeType) \ action -->
<action android:name="android.intent.action.VIEW"/>
<data android:mimeType="cc.android/intent.demo"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<service android:name=".FirstService" >
</service>
<service android:name=".SecondService" >
<intent-filter >
<!--The intent filter parameters must match the intent datatype(mimeType) \ action -->
<action android:name="android.intent.action.EDIT"/>
<data android:mimeType="cc.android/intent.demo"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
</application>
</manifest>